Hmm...
Personally I would not have implemented a thread this way; I would have used members of a thread class that pause/resume the thread as and when, instead of using a shared critical section. But that is just stylistic...
I take it you have paused your program and found out where the deadlock is occurring. I would say that the cause is the call to GetCurSel(), which internally uses SendMessage() which is itself synchronous.
Put some tracepoints into your code (a breakpoint, except when hit it does not break execution and outputs a message), or if you don't have this functionality in your Visual Studio, add some TRACE statements. One after the GetCurSel() call, and the other immediately after the EnterCriticalSection() within your thread's Run(). When you get deadlock, see what the last message traced was and report back.