beh, proprio per la natura degli oggetti:
Se hai un oggetto hai un reference valido ad un'allocazione della memoria che chiamo l'oggetto stesso, per questo motivo quando chiami una funzione o un attributo sull'oggetto l'interprete JS sa dove deve guardare.
Per dirla in parole povere, facendo window.nonEsiste, tu gli dici "prendi quell'oggetto ed ottieni nonEsiste (che sia funzione o proprietà)" ma se fai solo nonEsiste tu gli dici "Vai a prendere nonEsiste" e l'interprete non sa se è un reference ad un oggetto, o il puntatore (che poi non si dice così, ma non mi ricordo il nome) ad un variabile, o se è una funzione, l'interprete sa solo che esiste e deve cercarla, ma siccome non esiste ritorna NON un undefinied, ma un'ECCEZIONE (un errore).
facendo typeof tu chiami una keyword di JS che effettua un'azione, in questo caso sa come comportarsi, perchè, come con l'oggetto di prima, esiste typeof, per cui ritorna undefinied e non un eccezione.
Spero di essermi spiegato.