Se vuoi programmare in JavaScript, devi essere pratico di JavaScript, almeno un minimo.
Ma si può sempre imparare, studiando.
Ma come "perché"?
E' come dire "ho due istruzioni, e una viene prima dell'altra... perché?".
Perché quello è l'ordine delle cose, è il principio di funzionamento del linguaggio, la convenzione prestabilita.
L'uso di setTimeout() non voleva essere una proposta di soluzione, ma una dimostrazione del fatto che tutto ciò che viene "rimandato", viene eseguito in seguito, a dimostrazione che lo script referenziato dall'elemento nella pagina viene eseguito sicuramente dopo quello che lo definisce, ma con l'uso del setTimeout() si "rimanda a dopo" la sua esecuzione.
Tu hai una funzione che crea un elemento il quale referenzia lo script da eseguire: ogni contenuto di quello script verrà eseguito dopo quello attuale, perché JavaScript non è multithreading e ciò che stai caricando si mette in coda alla routine corrente.
L'uso di setTimeout() serviva a dimostrare che, pur con un intervallo a zero, se gli fai eseguire la stampa di qualcosa definita nello script che stai caricando dalla funzione, questa stampa va a buon fine, questo perché quella stampa in console viene dopo il caricamento dello script, che viene dopo l'esecuzione della funzione che crea l'elemento dello script nella pagina.
In sintesi, non puoi nella stessa funzione utilizzare variabili definite nello stesso script che viene eseguito da un elemento <script> caricato dinamicamente.
In altri linguaggi sarebbe uguale, a parità di scenario.OK, uso altri linguaggi ma Java Script proprio non mi si appiglia
Non è un problema del linguaggio.
Studia l'Event Loop di JavaScript..