The reason why is because your map is evaluating into a
hash reference, not a hash - values take a hash for it's
argument, not a hash reference. Now, if you use a
tempory hash reference instead, the reason for the double
curlies becomes much more apparent:
my $hash = { map {$_ => $_ } @a,@b };
my @merged = values %{ $hash };