Reset_AVR(); sembra scattare arbitrariamente ma comunque non fa il reset

La tua #define contiene due istruzioni. Se non metti le graffe all'if, questo condiziona solo la singola istruzione immediatamente successiva. Il while rimane lì, fuori da tutto e non condizionato a niente, per cui viene sempre eseguito.

Se metti le graffe o usi il mio costrutto, di fatto il #define conta come un'istruzione sola.