It does go from lower levels to higher levels... more or less. A mutation from HH, read repair, or sstables streamed over from an anti-entropy repair can put old rows in the lower levels which will mess that up a bit. TWCS handles that a bit better (but still really not great).
It will read at most one per level (exception L0 which is STCS), and walk the sstables in order of the sstables age (which tends to correspond with level). Once it has all the columns it wont have to read any older sstables so it can stop because it knows that even if theres any data in older sstables it is obsolete and will lose in the LWW conflict.
There are some situations around counters, unfrozen UDTS, and tombstones where it will have to read all the sstables though.
The 90% comes from the cases where there are no updates to partitions. Because theres also a bloom filter with 10% false positive rate (default for lcs) it will 90% (ish) hit only the one sstable.
With update heavy or wide rows like time series, one sstable in each level will likely have the requested partition. In which case it will have to walk all the levels. For those it will use the sstables min/max timestamps and min/max clustering index to only read whats necessary. In terms of filtering the min/max sstable partition, and clustering is actually the first thing done.
The metric from nodetool tablehistograms
"sstables per read" is actually the number of sstables up for reading between the partition/clustering filtering and before the bloom filter check (since that may have to read from disk). So you can use that metric to see how many sstables are actually being considered and has disk seeks.