It is locked, but not locked enough. If another goroutine changes t while you compare with its values in a call on s, the view on what t is changes during the call. Take Intersection for example. While you iterate over the elements or s, you call Has() on t. Say item is 'x'. t does not contain 'x'. Before Has is reached, another goroutine adds 'x', then Has() is called in the Intersection goroutine, then 'x' gets removed again. That's not threadsafe, and you write nothing about the behavior of the methods in such a situation.
Thats a general problem, the set can change for all individual operations between calls because you only lock one operation and not everything contained in the call.
Parts can easily be fixed. Merge for example overuses the lock because the code was not `s.Add(t.List()...)`, Union could have been `return New(t.List()...).Add(s.List()...)`. Others are harder.