Quel che sta succedendo deriva, con buona probabilità, dalla cache in scrittura su disco tipica di qualsiasi server.

Per capirci: il tuo codice riceve l'immagine, la decomprime in memoria (le funzioni GD sempre decomprimono una jpg prima di poterla manipolare), causando così un notevole uso di memoria, poi la ridimensiona, causando così un ulteriore uso di memoria poichè viene fatta una copia dell'immagine stessa, poi procede a salvarla su disco e ad inviare al browser il codice html che a sua volta, richiede l'immagine come ulteriore richiesta http al server web.

Il punto è proprio che tutto questo uso di memoria, nonchè il fatto che l'immagine debba poi essere riconvertita in jpg per esser salvata sul disco, fanno sicuramente si che il server decida di rimandare il vero e proprio salvataggio sul disco dell'immagine ridotta a quando la rapida sequenza di pesanti rischieste http sia finita...

Detto in altri termini, non c'è una vera soluzione a questo problema, perchè stai semplicemente chiedendo troppo al tuo server: devi invece fare in modo che in una pagina l'immagine venga caricata e ridimensionata e salvata, e in UN'ALTRA pagina venga mostrata la versione ridotta.

In questo modo potrai essere certo che tra una richiesta http e l'eltra il server avrà avuto il tempo di effettuare davvero il salvataggio della versione ridotta dell'immagine!