Processing a sorted array is always faster. (This could be one of the most upvoted answer in stackoverflow). That question is about hardware but software gains from that too.
Sort both arrays.
Now start inner loop from outer loop's latest index(being equal to ownerid) equivalent of inner loop index, not from zero. You already have early quit so total complexity would be
O(small) + O(small) instead of O(bruteforce)
sorting nested loop nested loop unsorted
If you have time, you can install arrayfire(C++) and get some wrapper around it to use in C# for these brute-force calcs. Only this cheating would be better than linq's join for small(30k-100k) arrays.
Cheating dissolves when number of elements go millions and algorithm becomes utmmost importance unless you have 3-4 high-end gpus in case. Then it would stuck at around 30M then algorithm would shine again unless you have a cluster but if you have cluster, it would be a waste to not use advanced algorithm.
Best is C#'s own implementation ofcourse when CPU is used. As in the Ivan Stoev
's comment, a good hash function is better than sorting.