Grundsätzlich ist I2C als Multi-Slave-Bussystem so gestrickt, dass ein Slave von sich aus nie etwas senden darf, ohne dazu aufgefordert worden zu sein, das gäbe sonst Datenmüll. Ob gesendet werden soll und wenn ja von wem, entscheidet immer nur ein Master. Dabei ist es egal, ob momentan nur 1 Slave am Bus hängt oder viele, I2C ist eben grundsätzlich für multi-slaves konzipiert, ohne Sonderfälle für ausnahmsweise single-Slave setup.
Grundsätzlich sind bei I2C aber auch mehrere Master erlaubt, ob und wie das Arduino implementiert hat, weiß ich allerdings nicht.
Zur Funktion von onRequest etc. hilft vlt dieser Link:
http://html.szaktilla.de/arduino/6.html

Dass der ESP8266 sich bei I2C anders verhält als "normale" Arduinos, liegt sicher an seinem auf RTOS beruhenden single-core-Multithreading OS, bei dem der Scheduler zwischendurch von sich aus die cpu umschaltet zwischen Arduinoprogramm und WiFi-Firmwareroutinen; ich könnte mir vorstellen, dass er als Slave möglicherweise bestimmte Anfragen nicht erhält, wenn er gerade mit WiFi beschäftigt ist, während er als Master im Hauptprogramm nur dann auch I2C bedient, wenn er auch laut Scheduler "dran" ist.