UnionFind implementation
If I read the wikipedia article correctly then the algorithm should have amortized constant cost - and you have implemented it pretty much 1:1. Given that with your implementation you always start with disjoint nodes and any call to any of the public methods ends up calling Find which will automatically flatten the tree I doubt you can get much better.
UnionFindNode is not a particularly good name for the data structure: intermingles operations with the data structure in the name. Just Node or maybe DisjointSetNode would be better.
You could use == or != instead of ReferenceEquals which would make the code a bit easier to read.
Consider making your node class generic and add a T value property - right now your nodes are not all that useful as they don't hold any data.