We don’t let you use spawn actor in construction scripts because they’re run all the time. Whenever you change a property, move something, etc. So, unless you’re managing the lifetime explicitly of the actors you spawn, it’s very dangerous! As an example, if you spawn a new mesh in your construction script, and move it around, you’ll have one new mesh in your level for every tick that you moved your actor!
ChildActorComponent helps with this, because it manages the lifetime of the actor it creates. Every time the construction script is rerun, it cleans up the old version, and creates a new version.
The fact you can get around it is a technical limitation. Because we let you have shared state in the event graph, we can’t really prevent you from doing something like spawning actor in there. We could restrict it, but we felt that was far too restrictive in terms of general functionality! We figured that if people got to the point that they realized they could do something like that, they’d be advanced enough to know that it is potentially dangerous. At some point in the future, we may be able to be a bit smarter about that, but currently, we left the loophole in to not prevent you from doing all sorts of other function calls in the construction script.
Hope that helps to clarify!