The way the data is stored, PostreSQL doesn't know what offset to go to look at for the data for int200 column on any given row, without knowing the sizes of all previous columns for that row. So it has to loop through the null bitmap (at a minimum) of all earlier columns before it can know that most of them have zero size.
There is an optimization for cases where you are selecting a single column and that column is found to be null via use of the null bitmap. But you are selecting two columns not just the column int199, so you don't trigger this optimization. It is unlikely an optimization would be added for selecting multiple, widely separated columns. You would need some heuristic to decide what makes the columns widely separated, and then everyone would pay the cost for running that heuristic, even the vast majority of the cases that can't benefit from it. If you were willing to get your hands dirty with a bit of hacking, perhaps you could convince us otherwise. But monkeying around with the internals has a steep learning curve.
If you have a practical use case for making this situation faster, perhaps you should check out Citus Data's column store extension.