Hello Lenin,
In many cases, when you perform an action on a UI panel that involves redrawing all or part of the panel, it is necessary for the thread that owns the panel to process events, in order to paint the panel properly.
The function SetCtrlVal usually does not require event processing, but in some instances, such as when the control is overlapped, or when you are dealing with transparent bitmaps, then it is necessary to process events in order to redraw the panel properly. Notice that in your demo, the control on the right will finally redraw itself as soon as your program calls RunUserInterface (which allows events to be processed).
In general, even if you didn't have drawing problems, it is not a good idea to block UI threads for a significant amount of time, since oftentimes there are system messages (clipboard changes, etc...) which require events to be processed synchronously by every UI thread on the system. When a thread is blocked, deadlocks and other problems can arise.
So my suggestion to you would be: instead of having a secondary thread (the asynctimer thread) update the blocked UI, why not do the TCP work in a separate thread that you create explicitly, and do the UI updates in the main UI thread, inside a timer control callback for example, in which case the event processing will happen automatically.
Luis