Eine CriticalSection ist größtenteils im Usermode implementiert, daher sind weniger Context Switches nötig. Es gibt auch die Funktion TryEnterCriticalSection mit der sich "Timeouts" realisieren lassen.
Ich bin aber der Meinung, dass eine CriticalSection den lock bekommen sollte, wenn sie ihn braucht. Wenn der Lock nicht zwingend Nötig ist, ist ein Event/
Mutex/Semaphore besser geeignet.