Your question seems like is a common tree walk forking technique. Each time you would have recursed, you instead kick off another concurrent operation (enqueue it to a thread pool, etc). But you need to wait for all the subbranches to finish at the end. Simply add 1 to the countdown event for each sub-operation you kick off, and signal it at the end of each sub-operation. It is safe to do as long as you arrange the algorithm so it won't signal until it adds for each child operation.
I should add that you don't need to know the count up front, just make it 1 at the root, and each time you fork off to a child, add 1, then signal at the end of each one, and it will dynamically handle any tree with no up-front cost.
CountdownEvent has a method Add which lets you increase the count in flight.
Does that make sense? I may be way off track of what you are trying to accomplish.
However, if you really want a CountdownEvent that behaves the way you specified, it is quite easy to wrap a couple of interlocked operations in a class to do what you say.
However, CountdownEvent is built to be feather-weight, it's almost free if nobody waits before it's signalled. In the expensive case, it is optimal, no matter how many tasks (etc) it will only have to make one kernel transition to signal and one to wait, worst case.
To implement what you propose would require a synchronization around the signalling and resetting of the event. The countdown event relies on one simple principle, only the transition from nonzero to zero in a Signal call can possibly signal the event. There is no race, since it is not possible for more than one thread to change the value at one time (it's interlocked) so it is only possible for one thread to try to signal the event object (that awakens the other waiting thread). Perfect.
However, if you have multiple threads setting and resetting it, you need to sync around the set and reset, since the count might jitter a couple of times and multiple threads would all simultaneously be trying to set or reset the event. (Setting, resetting, and waiting for an event are all expensive because they all have to make a kernel transition and cause context switches). It wouldn't work unless you synchronized around something to protect the set/reset transitions. If they added this to CountdownEvent it would no longer be nearly optimal, it would be significantly more expensive.