@user3439894 has answered the part of the question about how to disable Ethernet and have it stay down; I'd like to address the question of why
ifconfig en0 down doesn't do it.
The basic reason is that macOS has two different levels of network configuration: the live state (which
ifconfig en0 down changes) and the "configuration database" which corresponds to the settings created in the Network pane of System Preferences and/or the
networksetup command. And there's a "configuration daemon" (
configd) whose job it is to adjust the live network state to match what the database says it should be.
The reason it works this way is that the config database describes the network settings in a more flexible and coherent way than the live state does. For example, the config database can have multiple groups of settings ("locations") and easily switch between them, adjusting everything -- interface state, IP settings, routing, DNS, etc -- in a single operation.
Anyway, when you use
ifconfig en0 down, you've created an inconsistency between the live state and what the config database says the state should be.
configd won't notice this immediately, because it isn't the sort of event
configd looks for (ethernet being plugged in or unplugged, WiFi network being joined or dropped, etc). But sometime later, something will wake
configd up and it may (or may not) reset the interface state back to what the config database says it should be.
So, the solution is to use Network Preferences or
networksetup. These both make changes to the config database, then wake up
configd so it'll apply the changes to the live state.