Yes, this behaviour is exactly as expected. In the range from approximately 5.5v to 3.5v the readings are practically identical, with the polynomial I calculated this becomes the 3536 you see. I made an image in to hope to clear things up:
View attachment 4001
The getInputVoltage function works by using the ADC to calculate the value of the internal 1.2v reference (analogRead(39)), this value is calculated in respect to the external reference, which is the voltage on which the Teensy runs (Vdd).
In the orange area, so the part from Vin:3.5v-5.5v, all readings are approximately on a vertical line. The input voltage is high enough so that the regulator which creates the 3.3v Vdd voltage level works well. The ratio between analogRead(39) and Vdd remains constant, at about 1.2v/3.3v = 0.3636, with a 12 bits ADC this results in the value: 4096 * 0.3636 = 1489 for readings of analogRead(39), this matches the position on the horizontal axis. This means that despite the change in the voltage, the change in our measured value is very little.
Once we get below ~3.5v, the Vdd voltage level starts dropping as the regulator is not able to maintain 3.3v anymore, this means that the ratio between analogRead(39) and Vdd starts changing. This is the green area in the graph. In this part, we can calculate a function which relates the value on the horizontal axis (analogRead(39)) with the value of the vertical axis (Vdd).
I am not familiar with that OpenLog card reader, but it seems to include an Atmega328, and 3.3v regulator and an SD card holder. That means the Atmega328 is running on 3.3v, when the input voltage is lowered this Atmega will stop working quite quickly. (Even 3.3v and a clock of 16MHz is
outside specifications?).
So yes the Teensy is probably still running (I remember the datasheet saying something like 1.8v as minimal Vdd voltage, don't pin me down on it though). You could try to connect the SD card directly to the Teensy and see at what voltage the Teensy + SD card combination stops working.