Once your threshold is over 1000, the maximum proper divisors will always include 2, 3 and 5 as divisors, so only bother to check multiples of 2, 3 and 5.
There really isn't any point in using concurrency for a limit of 20_000. The setup and bookkeeping drowns out any benefit. Really doesn't start to pay off until the limit is 50_000 and higher. Try swapping in the commented out race map iterator line below for comparison.
subpropdiv (\x) {my @l = 1 if x > 1; (2 .. x.sqrt.floor).map: -> \d {unless x % d { @l.push: d; my \y = x div d; @l.push: yify != d } } @l}put "$_ [{propdiv($_)}]"for 1..10;my @candidates;loop (myint $c = 30; $c <= 20_000; $c += 30) {#(30, *+30 …^ * > 500_000).race.map: -> $c {my \mx = +propdiv($c);nextif mx < @candidates - 1; @candidates[mx].push: $c}say"max = {@candidates - 1}, candidates = {@candidates.tail}";