First, which is correct, ‘NEWS’ as in the conditional or ‘News’ as in your description?
If either condition is TRUE then the whole statement is TRUE (inclusive OR). That is how OR works. So think about what happens when information gets fed into this. If your category is ‘Dog’ then both conditions are true and the code inside the ‘if’ runs, which I think is what you want. The category is neither ‘NEWS’ nor ‘Uncategorized’.
If your category is ‘NEWS’, the first is FALSE but the second is TRUE, so it still fires. The reverse is true as well. If your category is ‘Uncategorized’ the first condition is TRUE and the second FALSE, so it fires.
Since you only have one cat_name at a time that conditional is always going to be true. I am puzzled why it filters ‘NEWS’ at all, as you say it does. I just tested the logic and works as I say it does. Whatever the category name that ‘if’ is true.
Long story ?? but I think what you want is:
if (!($cat->cat_name != 'NEWS' && $cat->cat_name != 'Uncategorized')) {