The error you're getting isn't directly related to SOUNDEX. It could be any other function that requires a scalar value and it would be the same error, because your subquery returns a resultset, not a scalar value.
Solution 2 is probably what you want.
Syntactically the following query would also work, but (most certainly) not get the result you want (because it compares only against one SOUNDEX(territory) where territory doesn't start with 'sa0'). But it might give you some more insight how it works what I explained in the first paragraph and help you with other queries:
select * from sub where SOUNDEX(C_Name) = SOUNDEX((select top 1 territory from up where territory not like 'sa0%'));
The double parenthesis is actually syntactically neccessary here.