Opa Daniel,
Esse código é um pouco mais complicado de acompanhar pois temos muitas funções chamando outras, dificultando o acompanhamento de parâmetros e valores de retorno. 
Vamos por partes. A primeira coisa é guardar na variável resultado o retorno de c("Flávio", "Almeida")
Dentro de c, temos
function c(nome, sobrenome) {
    //nome = "Flávio"
    //sobrenome = "Almeida"
    return b(nome + " " + a(sobrenome));
}
Vamos retornar o valor de retorno da função b com o parâmetro nome + " " + a(sobrenome)), ou seja, "Flávio" + " " + a("Almeida"). Mas aqui temos outra função a no parâmetro, que será avaliada primeiro.
Chamamos a, na seguinte situação
function a(texto) {
    //texto = "Almeida"
    return "(" + texto + ")";
}
Portanto a devolve "(Almeida)". Voltamos agora a aplicação de b, que agora sabemos que será com o parâmetro "Flávio (Almeida)"
Em b, temos a seguinte situação
function b(texto) {
    //texto = "Flávio (Almeida)"
    return "@" + texto + "@";
}
Portanto b retorna "@Flávio (Almeida)@".
Recapitulando, a variável resultado é o retorno dec, que por sua vez retorna o valor de retorno de b (com um parâmetro que vem do retorno de a), que agora sabemos que é "@Flávio (Almeida)@".
No final, mostramos na tela o conteúdo da variável resultado, ou seja, @Flávio (Almeida)@.
Recomendo que você escreva num papel cada chamada de função com seus argumentos para fixar o raciocínio. É bem fácil se perder.