One creates a timer. One spawns a separate thread.
A timer triggers a WM_TIMER event after a certain time. Your program can respond to these events to be notified after a certain period of time has passed.
Let me make a little scheme, hoping this will be useful for you:
Using Timers:
Main Program
\-> Entrypoint
\-> Message Loop
\-> Your WM_TIMER handling procedure
Using Threads:
Main Program
\-> Entrypoint
\-> 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).