As a status update: we're back at the original failures:
$ perl6 -e 'my $t = q[%foo% %bar% %foo% %baz%]; my %b = foo => 1, bar => 2, baz
=> 3; $t.=subst("%{.key}%", .value, :g) for %b.pairs; say $t'
Method 'key' not found for invocant of class 'Any'
in block <unit> at -e:1
$ perl6-m -e 'my %b = foo => 1, bar => 2, baz => 3; say "{.key}" for %b.pairs'
Method 'key' not found for invocant of class 'Any'
in block <unit> at -e:1
$ perl6 -e 'say "{.key}" given a => 1'
Method 'key' not found for invocant of class 'Any'
in block <unit> at -e:1
It works when for is followed by a block (instead of the statement_mod form)
$ perl6 -e 'my %b = foo => 1, bar => 2, baz => 3; for %b.pairs { say "{.key}"
}'
foo
bar
baz