Вы ничего не пропустили.Это невозможно с данным объявлением функции.
Как вы писали, указатель передается по значению, поэтому при изменении он не будет распространяться на исходную переменную.
Вам необходимо изменитьпрототип к foo(struct node **n);
или struct node *foo(struct node *n);
и вернуть новый указатель как результат.