UObject vs UStruct vs An Alternative?

You can’t make UFUNCTION inside UStruct but you can have other UFUNCTION take UStruct as a parameter. Similar pattern is used for implementing BP functions for FVector.

UStruct can be passed by reference within c++ code but the limitation is that you can not expose a pointer/reference to BP through UFUNCTION or UPROPERTY.

Of course if you still have concern UActorComponent would be my secondary choice for just storing numbers or manipulating data of an actor. It’s a totally viable option and it’s easy to refactor later.