Intendi dire che la funzione Elabora_file1() dovrebbe restituire in qualche modo al main la matrice allocata dalla funzione Alloca_diz() ?
Se è così, non c'è nulla di difficile. Il tuo puntatore rimane un doppio puntatore all'interno del main e un triplo puntatore nella funzione Elabora_file1() (in rosso le modifiche):

codice:
int main ()
{
    char** diz = NULL; int num;

    num = Elabora_file1(&diz);
    if (num == -1){
        return 1;
    }

...........
}
codice:
int Elabora_file1 (char*** diz)
{
    FILE* pf1; int num, i=0;

    pf1 = fopen(f1, "r");
    if (pf1 == NULL){
        printf ("Errore apertura del file!\n");
        return -1;
    } //Lettura del file

    fscanf (pf1, "%d", &num);
    *diz = Alloca_diz(num);
    while (fscanf(pf1, "%s", (*diz)[i]) != EOF){
        i++;
    }

    fclose(pf1);
return num;
}
Fai attenzione a un fatto nella funzione Alloca_diz(): allochi per il puntatore m un certo numero "num" di puntatori char, poi però dopo assumi che tale numero di puntatori sia pari (almeno) a 20, dato che il ciclo esegue staticamente 20 iterazioni. Tutto ciò funzionerà correttamente solo se num sarà effettivamente almeno 20. E anche se dai per scontato che quel "num" non sia mai meno di 20, irrobustisci il codice con un controllo o scrivendo "i < num" come predicato di uscita del for. Considerazioni analoghe valgono anche per il while nella funzione Elabora_file1().
Ricorda inoltre di deallocare la memoria con la free() una volta che la matrice non ti serve più.