Vielleicht liegt es daran, dass GTK eventgesteuert ist. Wenn dein Code in einem Event-Handler steht, dann kann solange kein weiteres Event verarbeitet werden, solange die Schleife läuft. Deine Aufrufe von set_percentage lösen wahrscheinlich Events zum Neuzeichnen der Progress Bar aus, aber die können erst abgearbeitet werden, wenn "dein" Event behandelt wurde.
Wie die Abhilfe aussieht, hängt von der Sprache ab. Ein sleep wird nicht helfen, weil die anderen Events nicht in einem anderen Thread behandelt werden. Der Thread wartet sozusagen auf sich selbst. Aber es gibt in mehreren Sprachen Möglichkeiten, zwischenzeitlich aufgelaufene Events abzuarbeiten, so z.B. PeekMessage/DispatchMessage oder DoEvents. Vielleicht gibt es so etwas auch in GTK.