The logic is "falling through" - events are executed one after another, top down to the bottom. The issue you have here is that subevents do not know when you are using them as a switch statement - which is what you're trying to do here. There is no implicit break after a subevent, so Construct just keeps on executing.
Go through your event in question logically with the non-working version:
On any click, C2 does the following comparison:
if(active == 0 & c == 0) then (active = 1 & c = 1)
Then C2 does the next comparison:
if(active == 1 & c == 1) then (active = 0)
But we just made that true with the last event! So this event will always execute - and active cannot equal 1.
The solution to this can be what you posted as working - don't place events that are dependant on the outcome of other events below those events. OR you can use local variables. Have a global number, and test with each subevent that that number is 0. If it's not, it won't execute. If it is, execute the action and set the global number to 1. This guarantees only one event will ever execute in a subevent branch.