Is this the logic that you want?
where id = @id and col1 = 2 or
id <> @id and col2 = 1
I don't know why you are concerned about the performance of such a clause. You can do what you want with a case
statement:
where 1 = (case when id = @id
then (case when col1 = 2 then 1 end)
else col2 = 1
end)
But this is a needless "optimization". It is not even clear that the nested case
statements would be any faster than the first version. Such simple operations are really, really fast on modern computers. And, what slows databases down is the processing of large volumes of data (in general), not such simple operations.