I'm pretty sure it's mentioned somewhere in the docs that one should try to avoid sub-events unless necessary (probably because there's got to be some kind of overhead) but in this case the opposite appears to be true.
My guess:
The slow version runs a for each loop, and then compares and sets each Sprite individually.
In the fast version, the loop runs but doesn't do anything. The Sprites are then "collected" to bring the SOL into the sub-event, and the comparison and setting opacity is done as a single, optimized batch operation.