Naja, das sind keine Vergleichbaren Fälle, denn I2C und UART arbeiten beide mit Leitungen, die Standardmäßig von einem Pullup auf ihren Pegel gezogen werden. Das Signal zieht die nur auf GND runter. Die Push-Pull-Driver eines Ausgangs dürften hier nicht aktiviert werden. Die Ströme sind hier gering.

Wenn du einen Arduino Pin mit 5 V als Ausgang (max 40 mA) auf einen 3,3 V Eingang des MCU legst, müsste es eigentlich zum Schaden führen. Das Datenblatt des ESP8266 gibt aber dazu nicht viel her.

Hochohmig ist nett, wenn die Spannungsgenzen eingehalten werden - dann wird auch der Strom begrenzt. 3,3 V kannst du an den ESP (als Eingang) ohne Widerstand anschließen. Wenn du aber 5 V anschließt, werden die Schutzdioden leiten und ggf. höhere Ströme zulassen. Wenn allderdings dein 328P nur den Pullup aktiviert hat und nicht den Push-Treiber, dann ist der Strom schon dadurch begrenzt. Wenn du I2C benutzt, stellt sich die Frage, welcher der beiden die Leitung mit einem Pullup hoch zieht (oder vieleicht auch beide) und wie die Treiber das Signal handhaben. Ein Push-Treiber auf I2C-Datenleitungen erscheint mir wenig sinnvoll. Bei UART hast du zwei Leitungen. Der als Input geschaltete Empfänger (Rx) kann einen Pullup setzen. Der Sender ist als output konfiguriert und wird ggf. mit dem Push-Pull-Driver 40 mA Source/Sink bei 5 V auf die Leitung hauen. Wenn der MCU das überlebt, hast du Glück. Das würd ich mich nicht trauen. Eigentlich müsste aber der Sender zwischen Output Low und hochohmig umschalten. Der Strom auf der Datenleitung dürfte durch den Sender nicht mit 40 mA gespeist werden. Ob sich die UART-Einheit des 328P daran hält, ist ne andere Frage. Aber ein GPIO ist kein UART und kein I2C - in beiden Fällen wird ja meist eine sogenannte Alternative Function auf den Port geschaltet - wie die Hardware dahinter aussieht, darüber kann man nur spekulieren, wenn die Datenblätter nichts dazu sagen.