No puede hacer nada para llamadas XHR asincrónicas. No puede hacer que JavaScript "espere" la respuesta HTTP del servidor; todo lo que puede hacer es darle al sistema de tiempo de ejecución una función para llamar (su manejador), y lo llamará. Sin embargo, esa llamada vendrá a largo tiempo después de que el código que configura el XHR haya finalizado.
No todo está perdido, sin embargo, como esa función de controlador puede hacer cualquier cosa. Sea lo que sea lo que quería hacer con un valor de retorno, puede hacer dentro del controlador (o desde otras funciones llamadas desde el controlador).
Así, en el ejemplo, que cambiaría las cosas como esto:
xhr.onreadystatechange = function()
{
if (xhr.readyState == 4)
{
var resp = JSON.parse(xhr.responseText);
//
// ... whatever you need to do with "resp" ...
//
}
}
}