The way I would do it, assuming you have an actually end to a level which you call.
You can tie (using blueprints) level blueprint end level cast to the player controller (as its persistent) not the player (non-persistent) to give player the weapon. How you give the weapon is up to you.
If its a straight swap then you’d just replace said asset. If you want it in your inventory the I would assume it an array. Etc etc.
Of course I could be talking rubbish (no Unreal expert) but I’ve spent a fair bit of time coming up with crazy simple ways of doing things. Despite the performance cost.