Discussing this with Radoslav Hodničák on the Parcplace.net #smalltalk channel turned up that this could be due to blocks not being real closures in Squeak. Sending #fixTemps to the block that has [:x |...] seems to prevent the crash.
"<rh> process 1 is invoked with x=1, runs into critical, adds 1 to collection, get preempted. process 2 is invokes with x=2 (x is now 2 for all processes), runs into critical block, stops, processes 1 now tries to remove 2 and fails"
which makes sense.