... not quite sure, why the first version works, probably some perlish voodoo...
No vodoo at all. The Set behaves as any other container allowing to visit elements in ascending order. These three ways of iterating over set elements are equivalent, the first one having the smallest runtime overhead:
for my $elem (@$simplexFace) { ... }
for my $index (0..$#$simplexFace) { my $elem=$simplexFace->[$index]; ... }
for (my $iter=entire($simplexFace); $iter; ++$iter) { my $elem=$$iter; ... }
If you need true random access to its elements, then you indeed have to copy it into a plain perl array:
my @face=@$simplexFace;
my $elem=$face[$index];
...