This is bizarre behavior. I do tons of weird stuff in Pre Construct and never had this problem. I even set Events and dynamically create widgets and it all works fine.
Just to clarify, your screenshot is of a widget blueprint, correct? And when you say widget component, you actually just mean a widget, correct? A widget component is what you add to an actor.
Only thought I have is that maybe the “Accessed None” isn’t the widget itself, but a property on the widget?
Are you using a C++ base class? One time I had NativePreConstruct() that called Super::NativePreConstruct(). That calls my Blueprint, but the setup code in C++ only executed AFTER Super::NativePreConstruct() returns. So the blueprint would run BEFORE my C++ setup code. That meant that my member on the widget wasn’t allocated yet (ie. a material). So your delay would be letting the C++ NativePreConstruct() finish running and then the Blueprint can continue. IOW, the Super::NativePreConstruct() in C++ needs to be called at the end, not the start of your function. In your case, since you’re checking isValid, this could only happen if one of your variables was a C++ property set up in NativePreConstruct(), but the principle is the same and worth mentioning I think.
That’s all I can think of for now.