A simpler way to understand this is – an Alpha would block any read with start ts > max assigned as seen by the Alpha.
Zero maintains a MaxAssigned timestamp, which it streams to Alphas, along with all the records of start → Commit ts, guaranteeing that if MA = 100, then Zero has streamed all txns with Tcommit <= 100 as well (of course having guaranteed their persistence and high availability).
In your example, txn A has start ts = 1, so MA becomes 1. Then Txn B gets start ts = 2, then MA becomes 2. Typically Alpha would receive both of these MAs really quickly (micro-seconds), so reads with start ts = 1 and 2 can proceed.
When Txn A wants to commit, it would a new commit ts = 3, with MA now becoming 3. At the same time, a new start ts is given to Txn C, with MA becoming 4. That MA=4 can’t be streamed out immediately. That’s because Zero has to achieve quorum on the commit, so if Zero dies, we don’t lose that info. It would run quorum on 1-> 3 (start → commit), which might take milliseconds, and thus delay the stream of MA = 4. That’s when Txn C could get delayed in starting its read.
Other ways, reads could be delayed is of course, if Alpha falls behind wrt MA.