guarda, facilissimo

setTimeout si aspetta come primo argomento un' istruzione da valutare (come se usassi l' eval), questo implica che al suo interno puoi concatenare

dopo un secondo, la funzione in cui e' inserito il timeout e' stata eseguita ed e' finita, gli argomenti di quella funzione o le variabili locali non esistono piu'

resta da valutare quella inserita nel timeout, immagina di richiamare
countdown(countdowntime)
cosa e' contdowntime? niente, perche' era un argomento della funzione ormai eseguita
immagina di richiamare
countdown(174567)
cosi' ha senso

quando scrivi
setTimeout("countdown("+countdowntime+")",1000);

fisicamente concateni nell' istruzione da valutare il valore che al momento ha la variabile (che in realta' e' un argomento)
se potessi vedere il risultato della concatenazione sarebbe
setTimeout("countdown(174567)",1000);

esguita dopo un secondo ha ancora senso