What’s keeping the Array of UProperty alive after the function returns? You’re returning one of the elements, so the array (or more importantly the original container of the UProperty pointers) must stay alive after the function returns.
I would suggest creating local variables in your BP for your arrays and see if that fixes it (then you’ll know it’s a lifetime issue)… OR
Could try using TObjectPtr<UProperty> &Key
as the last argument for returning the value to keep it alive (not sure if this would work with BP)… OR
Why not just write a static function with the proper types? Making the enum in C++ is trivial. Then you don’t need to deal with UProperty pointers.