Reading microseconds does indeed disable interrupts, but only very briefly. The low-level code is here:
https://github.com/PaulStoffregen/cores/blob/master/teensy3/pins_teensy.c#L1068
Those three things need to be read without an interrupt occurring. The alternative is to read them repetitively, until 2 consecutive readings are consistent. That's what Arduino does on Due:
https://github.com/arduino/Arduino/blob/master/hardware/arduino/sam/cores/arduino/wiring.c#L41
Their way has the advantage that interrupts aren't disabled. But it requires reading everything twice, and extra code to check if the 3 numbers are consistent... so it's slower.
My gut feeling is micros() wants to be fast. It's used by elapsedMicros() and other code which obviously wants higher timing precision than millis() can give. I must confess, I haven't studied the exact timing of both approaches. Their's might be well under 1 microsecond.
Mine does disable interrupts, but the disable time is only 3 load instructions. Actually, I haven't checked if the compiler is putting extra register setup overhead into the interrupt disable region, so it might be a few more instructions to set up registers with the 3 addresses.
If anyone wants to dig into really analyzing the actual timing of these 2 approaches, I'm certainly willing to consider changing. This is one of hundreds of little optimizations I've thought about, but (so far) haven't put much real work into pursuing.
But if millisecond resolution is enough, millis() or elapsedMillis never disables interrupts. It just reads the 32 bit count, which is an atomic read since we have a 32 bit bus.