First off string comparisons are never going to be highly efficient just by the nature of that beast which is why numerics are used most of the time. For instance, in this table structure if there was a table that held the ProductReturnReason descriptions with a key value and then that key value is what is stored in the other table your WHERE clause could be made much simpler and more efficient. Aka no sloppy concatentation required and no string searches needed.
So I would suggest building staging tables that stages that data in a more friendly manner. You are not changing the existing structure but adding a new table that reformats that ugly table into what it should have looked like. You can even do this on the fly, using a temp table but then you are going to lose time building the temp table each time where building it ahead of time on a schedule or via a Trigger would be the best.
ReturnedProdReasonId INT IDENTITY(1,1)
,ProductId INT -- (FK)
-- Create a Non-Unique Clustered Index(es) based on how you plan to query the data
ReasonCode INT IDENTITY(1,1),
-- This table holds the individual Reasons 'c_reason_1', 'c_reason_2', 'c_reason_3'
-- New WHERE clause
-- WHERE ReasonCode NOT IN (2, 3)
Again this assumes you can create these new staging tables, otherwise, I am not aware of any way to more efficiently query a poorly designed string column. The only other thing that might be helpful is to make sure there are quality Indexes on the table you are actually querying. Sorry I could not be of much more help, perhaps someone else will have a better solution.