Let me make a little scheme, hoping this will be useful for you:
\-> Message Loop
\-> Your WM_TIMER handling procedure
\-> Thread Entrypoint
\-> ...Other threads entrypoints
As you can see, Timers are "Part" of your program flow, where a Thread is not, it runs on its own, so it won't block your main program flow. Also, it does not require a message loop, but it can be used to call a specific function (see TimerProc).