Probabilmente perche' se per caso l'ultimo controllo che fai va bene, la variabile controllo divnta false e continua lo script anche se una o più prima erano a true.

O metti un return false ad ogni errore e quindi fai i controlli in progressione, oppure dovresti gestire diversamente quella variabile.

Es.: se Nome non va bene controllo=false (alert errore...)
poi passa al Cognome (cognome ok e la viariabile controllo torna true eliminando quella a false di prima).

Potresti fare un ciclo su i vari campi obbligatori e fare un unico alert con i nomi dei campi mancanti. O senza alert facendo apparire l'errore sotto i vari input ( o unico messaggio di errore). In questo modo al primo controllo=true(se nn error in caso di errore) blocchi il submit con return false;

PS non vorrei dire ma il submit forse viene eseguito perche' hai usato un input di type submit e quindi esegue comunque. Prova con un type button e metti il submit in javascript( dopo i controlli)