Arduino ultrasonic sensor
If we look at the source code for pulseIn we can see it doesn't use any of the timers.  The pulseIn function loops until the pulse finishes and then converts clock cycles to microseconds.

The cause of your problem might be interrupts when the servos are active.  Somewhere in the middle of your measurement, in the pulseIn function, an interrupt occurs which allows the underlying servo code to manage the position/movement of the servo.  However this means that the pulse width (see line 59) is not being updated whilst the interrupt code runs.  Therefore you get results that are too small.

This seems to perfectly match your description of small pulses reading correctly (they are less likely to be interrupted by other code) and longer pulses reading wrongly.

This is what the "capture" mode is for in most microcontroller timer modules.  You start the timer in capture mode, leave it to run in the background and then use the value when it finishes.  This can't get interrupted because it's a hardware function that runs in the background.

You might like to read up in this Atmel appnote (your use case is much simpler, but the appnote does a good job of explaining).  If there is no Arduino code to do the measurement you'll have to use the timers directly, assuming this is compatible with the servo code.  Have a read of this webpage for how to do that, see for example the ICR1 register.