1 - don't store things like IsTrash as a string. Use a bit if that's what you're storing ( 1 or 0 )
2 - try adding an index to every column you're checking to see if it speeds things up
3 - don't use DISTINCT if you can avoid it. It's not needed here, the DB does not need to filter the list to be distinct before checking on it.
4 - EXISTS is indeed faster, but getting rid of subqueries is better:
select COUNT(id) as tablecount from tbl_Panelist pl
left join tbl_PanelistActivity pa on pa.UserName = pl.UserName and pa.ActivityDate > (GETDATE()-180)
where pl.IsTrash='0' and pl.Subscribe='1' and pl.Pending='0' and pa.Username is null
this uses a left join, if the pa values are null, then the values did not exist in the pa table.
5 - give your users a numeric id so the DB can filter on that, instead of reusing the username everywhere. What if someone changes their username, do you change it through the DB ? A numeric id will keep the records with the old username, associated with the new one.