Tenes razón, en mi ultimo código nunca se va a apagar. Pero este funcionaria (jugando a la ruleta rusa

):
while(1)
{
if(boton_off ^ boton_on)
salida_led=boton_on;
}
Todas las soluciones para incorporar alguna especie de protección ante el cambio de la entrada en ese punto q
ue se me ocurren ahora ya vamos a definir 2 o mas variables.. y dejan de ser tan cortitas asi

Me refiero a sin hacerlas bloqueante, sino agregandole un while al final lo soluciona. Del mismo tipo que tenes vos, es decir:
while(1)
{
if(boton_off ^ boton_on)
salida_led=boton_on;
while( boton_on || boton_off );
}
O de ultima y creo que solucion final ahora si, entonces no hay mas problemas con que cambie boton_on en medio de la situacion (aunque para mi lo correcto es que se tomen ambos botones y leerse juntos):
while(1)
{
bool a = boton_on;
if(boton_off ^ a)
salida_led=a;
}
PD: Esto es puramente por diversion jeje
PD2: Espero no haberme equivocado de nuevo