Тогда вам надо не Sleep выполнять, а самому нужный промежуток времени отслеживать:
Код:
StartTime := GetTickCount;
While Form1.ProgressBar1.Position<100 do
Begin
a:=random(15);
if GetTickCount - StartTime >= 3000
then begin
Form1.ProgressBar1.Position:=Form1.ProgressBar1.Position+a;
StartTime := GetTickCount;
end;
Application.ProcessMessages;
End;