the marker would need to be 0 for old nodes to treat the transaction as valid. [...] Is there something I'm missing?
What you may be missing is that old (pre-segwit) nodes never see segwit data, when segwit nodes send data to pre-segwit nodes they edit out all the segwit fields.
Part of the protocol handshake identifies segwit nodes
Consequently the marker is always zero and the only currently defined value for the flag is 1 (as far as I know). When parsing I rely on the marker being zero, to distinguish it from an input count, but I allow for any non zero value of flag.
Rationale for not using just a single 0x00 byte as marker: that would lead to empty transactions (no inputs, no outputs, which are used in some tests) to be interpreted as new serialized data
This says that the 0x00 marker is necessary but is not sufficient to reliably distinguish pre-segwit transaction serialisation from segwit transaction serialisation.
I believe it claims you need the additional flag to distinguish a segwit transaction (with any number of inputs) from a pre-segwit transaction that has no inputs (input count = 0).
I don't think this is actually true for mainnet†. I think there are no transactions using the pre-segwit serialisation that have no inputs. Perhaps it is true for one of the other Bitcoin networks (testnet etc). I wrote a parser that would fail if fed a pre-segwit transaction with no inputs - It hasn't failed but admittedly I haven't tested it against every transaction in the whole mainnet blockchain.
Related
Footnotes
† Minimum number of inputs
https://developer.bitcoin.org/devguide/transactions.html says
Each transaction has at least one input
How to create a bitcoin transaction without inputs
Only the coinbase transaction is allowed to have a null, or non-existent input [...] Coinbase transactions have inputs. They just reference null outpoints