Your assumption is correct. The ObserveOn operator has an internal queue so that it can safely serialize your OnNext calls onto the provided scheduler.
As you said, this is a classic problem. You have many options to choose from:
Enqueue values that are produced faster than the consumer can process them, which is what ObserveOn is doing. (Buffer)
You might only take the most recent value, or aggregate all buffered data (count/sum/average) or apply another algorithm to deal with bursts of data. (Conflation)
Block the producer to stop it producing data. (Backpressure)
Each of these will have different impacts on your application and some are more appropriate for various solutions. Currently Rx doesn't support the Backpressure option. I would suggest, that if you did want the backpressure option, then you may want to consider
a different technology to Rx, maybe the Disruptor of the Blocking Collections from TPL. If you really want to stick with Rx, then I would suggest creating your own version of the ObserveOn operator that still takes an IScheduler but also takes a integer for
the max queue length.