RFCs are cached per-TNObject. TNObject's RebuildMethodList() function gets a list of all MonoBehaviours on its GameObject's hierarchy (using Unity's GetComponentsInChildren function), then for each MonoBehaviour it uses reflection to iterate through each Method and checks if a Method is decorated with the [RFC] attribute.
So it seems you can only use the [RFC] attribute on methods defined in classes that derive from MonoBehaviour, and each ID is unique to that TNObject (technically the top-most TNObject in that GameObject's hierarchy since it detects parenting using Unity's GetComponentInParent).
However, if you can get a reference to a TNObject you can use a known ID on that object rather than your own object. You can do this from non-MonoBehaviour classes, too.
There's a static function in TNObject to Find a specific TNObject, but it's not meant to be used for this as it requires knowing its UID.
I think caching RFCs globally could be better, and I wonder what ArenMook would think of this. TNet already iterates every Type of every Assembly when it caches RCC's, so in the same step it could cache RFCs too. Since an object instance is used in the invocation of the method already the methods don't even need to be bound to an instance. Could also speed up method invocation using something like this:
https://stackoverflow.com/a/41516621. I think the RFC packet structure would need to be changed, though, and there might be some design issues with that. ArenMook is a design genius, so I trust his judgement!