il termine Caricamento Asincrono ti dice qualcosa?

Allora, facciamo l'esempio:

tu lanci i tuoi script in sequenza.
Dato che Image carica le immagini in maniera asincrona, lo script non si interrompe quando carica l'immagine (quella è l'idea dietro all'onload dell'oggetto Image).

Bene, metti che l'immagine uno sia l'indice 3 dell'array e l'immagine due sia l'indice 1.

L'immagini sono in caricamento, ma, per qualche paperocchio con il thread di connessioni, il browser carica prima la due della uno.

Che succede all'array? l'immagine in posizione 1 viene rimossa dall'array, mentre l'immagine in posizione 3 non è ancora stata caricata. L'immagine in posizione 3 viene caricata e lo script tenta di rimuoverla, peccato che rimuova quella in posizione 3 che, visto che la uno non c'è più, è in realtà la 4. Hai capito che succede?

Devi fare in modo che quando rimuovi l'immagine dall'array, non usi l'indice, ma lo scansioni controllando gli url delle immagini, fino a quando non trova quello uguale al src dell'oggetto this.