Ripeto: il problema è che mentre stai ancora aspettando la risposta (asincrona) viene eseguito l'if, per cui all'interno della funzione inviapost otterrai il valore correttamente, mentre al di fuori invece no

ti basta definire una funzione di callback, ad es.


codice:
function inviaPOST(pagina, dati, callback) {
	if (ajax) {
		// inizializzo la richiesta in post
		ajax.open("post", pagina, true);
		
		// imposto il giusto header
		ajax.setRequestHeader("content-type", "application/x-www-form-urlencoded");
		ajax.setRequestHeader("connection", "close")
		
		// effettuo la richiesta inviando i dati formati da coppie chiave-valore
		// dati = escape(dati);
		ajax.send(dati);
		
		ajax.onreadystatechange = function() {
			if(ajax.readyState === 4) {
				if(ajax.status == 200) {
					return callback(ajax.responseText);
				}else{
					alert("Operazione fallita, errore numero " + ajax.status);
					return null;
				}
			}
		}
	}
}


function controlloErrore(id_elem, id_span) {
	var risposta = null;
	inviaPOST('controllo.php', 'azione=... , function(risposta) {
	      if (risposta) {
		    if (risposta != '') {
			prendiElementoDaId(id_elemento).className = 'textbox2';
			cambiaTesto(id_span, risposta);
		    }else{
			prendiElementoDaId(id_elemento).className = 'textbox1';
			cambiaTesto(id_span, '');
		    }
	      }
      });
}
la parte in rosso la cambi di volta in volta, facendo eseguire funzioni diverse con la risposta