You are correct, you cannot do this without using current().
The problem with your approach is that it is starting at the root node of your main DOM and looking for ANY my:CostOrg that is part of ANY my:group11 table. This is why you are experiencing what you are. When you start from the root node, there's not much you can do to prevent that unless you can filter for a specific repeating section (my:group3[2]). To do this easier, you use current().
The biggest trouble people (including myself) have with current() is understanding just what node that represents so that you can build an appropriate XPath from it. The data source task pane often gives you a clue by BOLDING the specific node that is the current node--there are some rare exceptions to this, but in general this is the case. So in your case my:group11 is bold, and is the current node.
Thus your filter would be this:
not(@CostOrgCode = current()/../my:group11/my:CostOrg)
Note that I go up one level from my:group11 to the table container, then back down into the table and into the my:CostOrg field. This is important because current() doesn't actually represent the TABLE itself, but the specific ROW of the table that you are currently on. Thus, to compare against all of the rows in the table, you have to get outside to the table container, then back so you can compare against each row.
I hope that was enough to make sense to you can unstick yourself in the future too.
Good luck,
Greg