The only reason it's needed is because loading the index also initialized the llm_predictor and embed_model under the hood.
Technically, you could load the index with a fake key and it would work fine... I think lol just a little hacky
os.environ["OPENAI_API_KEY] = "FAKE"
index = load_index_from_storage(...)
# re initialize models with proper key
index.service_context llm_predictor = LLMPredictor(llm=ChatOpenAI(..., openai_api_key="real"))
index.sevice_context.embed_model = OpenAIEmbedding(openai_api_key="real")