Non riesco a capire come mai non elimini l'elemento, però in compenso posso risolverti il mistero del perchè avevi ancora la lista quando mettevi l = NULL.

Quando passi l alla funzione, passi un puntatore ad un oggetto. Ma non passi il puntatore: il puntatore viene passato per valore, non per indirizzo.

Esempio:
codice:
void foo (int a)
{
    a++;
}

...
int x = 10;
foo(x);
//x vale ancora 10
Allo stesso modo:
codice:
void foo (nodo* n)
{
    n = NULL
}

...
nodo* p = lista;
foo(p);
//p sta ancora puntando a lista
Questo perchè il suo valore non viene modificato dalla chiamata a funzione, dato che è un argomento.

Per eliminare un elemento da una lista ti consiglio però la versione ricorsiva dell'algoritmo: la trovo molto più semplice ed elegante.

codice:
node* elimina(node* n, int val)
{
    if (val == n->valore)
        return n->next;
    else
        return elimina(n->next, val);
}