Como la palabra en inglés lo indica un callback es una “llamada de vuelta” y este es un concepto importante al momento de escribir código. Es simple: llamo a una funcion y le envío por parámetro otra función (un callback) esperando que la función que llamé se encargue de ejecutar esa función callback.

Para ver mas esto de utilizar funciones como variables pasen por aca

function haceAlgo(miCallback){
    //hago algo y llamo al callback avisando que terminé
    miCallback();
}

haceAlgo(function(){
   console.log('terminó de hacer algo');
});

También podemos enviar y recibir parámetros:

function haceAlgo(miCallback){
    //hago algo y llamo al callback avisando que terminé
    miCallback('cualquier cosa');
}

haceAlgo(function(queHizo){
   console.log('terminó de hacer ' + queHizo);
});

Pero callback no significa que voy a llamar cuando termino algo, simplemente puedo tener distintos callbacks que se van llamando en determinados casos.
La idea es disparar eventos en las funciones que llamaron “avisando” que esta sucendiendo, por ejemplo:

function haceAlgo(callbackPaso1, callbackPaso2, callbackTermino){
    //algo aca
    callbackPaso1('paso 1');

    //sigo... algo aca
    callbackPaso2('paso 2');

    //sigo ... y termino
    callbackTermino('terminó');
}

haceAlgo(
    function(quePaso){
       console.log(quePaso);
    },
    function(quePaso){
       console.log(quePaso);
    },
    function(queHizo){
       console.log(queHizo);
    });

También lo podemos utilizar declarando funciones nombradas y separando la lógica:

function haceAlgo(callbackPaso1, callbackPaso2, callbackTermino){
    //algo aca
    callbackPaso1('paso 1');

    //sigo... algo aca
    callbackPaso2('paso 2');

    //sigo ... y termino
    callbackTermino('terminó');
}

function paso1(quePaso){
     console.log(quePaso);
}

function paso2(quePaso){
     console.log(quePaso);
}

function termino(queHizo){
     console.log(queHizo);
}

haceAlgo(paso1, paso2, termino);

De esta forma creamos funciones nombradas fuera de la llamada y estas a su vez podrian disparar otros eventos (con collbacks) tambien.

Por último y no menos importante, los callbacks No son asincrónicos, es decir, dispara el callback y cuando termina la ejecución de esa función de callback continua desde donde lo disparó. En el ejemplo anterior dispara el callbackPaso1() y cuando este termina, continua continua la ejecución disparando el callbackPaso2().

Para realizarlo asincronicamente deberiamos utilizar un setTimeout()