I'm not sure what you mean with "EAR/MIC I/O was level based". In the ZX Spectrum, the EAR input is a digital input, so it can only be 1 or 0. You cannot measure the input level beyond that.
The main reason to use edges is for the system to work independently of the audio source. Other systems, such as the Commodore 64, need the datasette to supply a signal with the correct polarity, or the program won't load (this is because the CIA only detects falling edges and starts measuring time from those). The ZX Spectrum doesn't matter if it is a rising or falling edge. It just has to be an edge.
Working with levels in a polarity independent way may require more complex code, and one distinctive feature of the ZX Spectrum ROM loader is that it doesn't require any memory location to hold temporary variables while it is executing. Everything (byte being loaded, bit being added to the current byte, time constants, counters, checksum, length of data to load, current address to store the loaded byte to, etc, are held in registers. Only the stack is used as the routine calls several sub-routines. A more complex code might break that.
"it seems unnecessary if not dangerous to rely on edges when levels would appear to be fine after applying some chattering removal". Chattering removal would need a better input filter, and/or a hysteresis driven input. None of that is present in the ZX Spectrum.
Of course, an edge based loader has the inconvenient of triggering load errors if an edge is read when it shouldn't. The ZX Spectrum tries to minimize the effect of spureous signals by forcing the user to use a volume setting of about 70-75%, which is pretty loud.