buenas,
en realidad puedes hacerlo, solo que en lugar de hacer una petición asíncrona, debería ser síncrono. en el tercer parámetro de open debes indicar false para este tipo de petición. luego al final de la función debes devolver la respuesta de la petición. fijate que no me refiero del evento onreadystatechange, sino de tu función. si quieres hacer la petición asíncrona, no tiene sentido devolver la respuesta en el evento porque no hay forma de indicarle un capturador para lo devuelto por un evento. tienes que pensar más en el modelo event-driven. cuando tengas la respuesta de la petición, entonces invocar una función para procesar la respuesta.