Why Unreal shows my variables from C++ only after full reloading of engine?

UPROPERTY(EditAnywhere, Category = NPCMessage) FString NpcMessage;

I add this in code and compile this< after hot reload unreal doesn’t see this property, I need to restart engine to see it. Is it how it must work?

Yes and no.

Hot reload is not perfect as it requires hot swamping old version of your module to new one while it is running and rest of the code from other modules needs to be aware of it to properly update, which is not 100% covered as engine code base is massive and sometimes creates issues. Doing so with native code is always a risk, as it means memory address changes, which ultimately means higher risk of invalid pointers, entire code needs to be aware of those changes. Changes to reflection system (class structure information) is most risk inductive as lot of editor features and most impotently blueprints heavily depends on. So it is always better and safer to compile code with editor closed, why use hot reload only to quickly check small changes.

But, if you find any consistent bad behavior of hot reload it is good to raport it as bug, to make it better. And even if Epic don’t have intention to fix those they should inform you why in return email. So it is always worth a try: