ADC und TWI blockieren sich nicht, wenn du Interrupts dafür verwendest. Wenn du in einer while-SChleife bist, macht dein µC ja nix anderes.

Der Slave erscheint mit recht mager. AVR-TWI implementiert ja eine komplette State-Machine, die zu bedienen wird wohl etwas mehr aufwand.

Bei den avr-Includes gibt es auch ein Include für twi (avr/twi.h), dann hast du defines für viele Konstanten und lesbareren Code.