I modified my auto downloading code to look for the Head Timestamp to prevent requesting data before that but I have found that it creates more problems than it solves.
reqHeadTimestamp() suffers from pacing violations which do not conform to the standard 50 messages per second rule. The problem is that when the reqHeadTimestamp() faces a pacing error it hangs and doesn't recover and it doesn't report any error messages (unless you tick that option in the API settings to reject messages instantly). There seems to be some internal code problem in the API on IBKR side but trying to explain this to them will be a nightmare I am not willing to pursue.
It is true that if you load VICI data on any period within its life in the SP500 it works without problem. There are other symbols that suffer similar problems when trying to get very long history:? AAL, LIN, MNST. Those 4 fail when trying to get 25 years of daily history. Every other stock in the SP500 will work when asking 25 years of daily history with Richard's proposal below of using SMART + NYSE.? (In my code I am actually calling reqContractDetails() with the symbol, currency, sec type & exchange set (e.g. MSFT, USD, STK, SMART) and using the contract returned in my call to reqHistoricalData() which also works fine.)
It seems clear, as also mentioned by Richard, that IB do not care much about fixing their data problems, so we just have to live with them. As painful as it is to my Engineering core, I will write exceptions into my code so that it works around these few stock failures automatically.