Para hacer una petición ajax con vanilla JS en PhalconPHP o cualquier framework o proyecto con PHP plano. Necesitaremos hacer 3 pasos:

1.- Crear el fichero

JS el cual iniciará la acción, este estará enlazado con un evento en nuestra view. Este ejemplo recoge un posible cambio en un selector para disparar la llamada Ajax con esa información que cogemos u otra cualquiera.

var provinciaCentroElement = document.getElementById("provincia_id");
if (provinciaCentroElement) {
    document.getElementById("provincia_id").onchange = function(evento) {
        if (provinciaCentroElement.value != '') {
            evento.preventDefault();
            var r = new XMLHttpRequest();
            r.open("POST", "/home/getLocalidadesAjax", true);
            r.onreadystatechange = function () {
            if (r.readyState != 4 || r.status != 200) return;
                var response = r.responseText;
                var capaRecargaLocalidades = document.getElementById("recarga-localidades-ajax");
                if (capaRecargaLocalidades) {
                    capaRecargaLocalidades.innerHTML = "";
                    capaRecargaLocalidades.innerHTML = response;
                }
            };
            r.setRequestHeader('X-Requested-With', 'XMLHttpRequest');
            r.setRequestHeader('Content-Type', 'application/json');
            r.send(JSON.stringify({
                provinciaId: provinciaCentroElement.value
            }));
        }
    }
}

Una vez tengamos el elemento llamaremos a un controller y view pasando la información que queramos  en formato json mediante ajax.

2.- Crear la función en el controller llamado desde el JS

Básicamente aquí cogeremos el parámetro que nos envían y haremos con ello cualquier proceso que necesitemos. El objetivo en nuestro caso es coger las localidades de una provincia para sacar un selector de las localidades en la view.

public function getLocalidadesAjaxAction()
{
    $this->view->setRenderLevel(\Phalcon\Mvc\View::LEVEL_ACTION_VIEW);
    $request = new \Phalcon\Http\Request();
    $provinciaId = $request->getPut('provinciaId');
    $this->view->localidades = Localidades::find(['conditions' => 'provincia_id = ' . $provinciaId, 'order' => 'nombre']);
}

3.- Crear la view

Esta view contiene el selector que necesitamos refrescar o pintar en la view, el cual estamos enviando la view mediante el innerHTML del JS a una capa vacia que estaba ya creada en la view para recargar el ajax.

<?php if (isset($localidades[0]->id)) { ?>
    <label for="fieldLocalidadesId">Localidades</label>
    <?php
        echo $this->tag->select([
            'localidad_id',
            $localidades,
            'using' => [
                'id',
                'nombre',
            ],
            'useEmpty' => true,
            'emptyText'  => '-- elige ua localidad --',
            'class' => ''
        ]);
    ?>
<?php } else { ?>
    <p>Lo sentimos, no disponemos de localidades en tu provincia</p>
<?php } ?>

Con estos pasos tendremos una llamada AJAX con VANILLA JS, esto lo agradecerá el usuario y google, ya que los tiempos de carga son menores debido a que no utilizamos una librería externa para hacer Ajax.