Rispondo velocemente al discorso dell'onload, sperando di spiegarmi.

Quando arriva al browser la risposta alla chiamata http, questo deve renderizzare, ovvero tradurre, tutto ciò ch ec'è scritto dentro, ovvero il nostro codice (HTML, Javascript e quant'altro).
Se javascript interviene sul DOM, ovvero sulla struttura dell'HTML, o meglio sugli elementi che i tag rappresentano,
va da se che bisogna che questi elementi siano stati già caricati dalla pagina.
se io metto un document.getElementById("id") prima dell'evento onload, il document non troverà nessun Element .. perchè non è stato ancora creato.
Perchè allora il tuo codice funziona? Perchè il tuo codice javascript è scritto DOPO i tag html. Pensala così: il browser legge riga per riga il markup della tua pagina e nel mentre crea il DOM. crea quindi la tua immagine, poi arriva a javascript e lo interpreta. E' ovvio che, avendo già renderizzato il tag <img /> il codice vada a buon fine.

Non è molto elegante però nè chiaro inserire codice javascript all'interno della pagina HTML, oltretutto da problemi di validazione come hai visto. E' melgio allora inserirlo in un file esterno, ricordandosi però di aspettare l'avvenuto onload della pagina.

Per il problema del setTimeout: prova setInterval. settimeout effetta la chiamata una volta sola, setinterval a ripetizione, se non ricordo male.