Buenas,
Yo hice una función parecida, el problema que tenés lo solucioné separando el caso que sería tu else if en 3 subcasos:
Si a->izq != NULL y a->der != NULL, hago eso mismo que hacés vos: return (a->elem==l->elem) && (esCamino(a->der,l->sig) || esCamino(a->izq,l->sig));
Si a->izq == NULL y a->der != NULL devuelvo (a->elem==l->elem) && esCamino(a->der,l->sig) ;
SI a->izq != NULL y a->der == NULL devuelvo (a->elem==l->elem) && esCamino(a->izq,l->sig) ;
De esa manera evito que devuelva true el subarbol vacío.
Yo hice una función parecida, el problema que tenés lo solucioné separando el caso que sería tu else if en 3 subcasos:
Si a->izq != NULL y a->der != NULL, hago eso mismo que hacés vos: return (a->elem==l->elem) && (esCamino(a->der,l->sig) || esCamino(a->izq,l->sig));
Si a->izq == NULL y a->der != NULL devuelvo (a->elem==l->elem) && esCamino(a->der,l->sig) ;
SI a->izq != NULL y a->der == NULL devuelvo (a->elem==l->elem) && esCamino(a->izq,l->sig) ;
De esa manera evito que devuelva true el subarbol vacío.