Вам уже ответили, но можете конечно сделать так в главном потоке
procedure Test;
const
n = 200;
var
I: Integer;
begin
pb1.Min := 0;
pb1.Max := n - 1;
for I := 0 to n - 1 do
begin
pb1.Value := I;
sleep(10);
Application.ProcessMessages;
end;
end;
не понял вопрос. мы работаем в обработчике одного из событий очереди сообщений в главном потоке.
событие отрисовки тоже стоит в очереди в главном потоке. закончим обработчик, запустится следующий, произойдет перерисовка.