I found the reason. In query plan for the first query, there is this:
That is, there is a plan guide that is forcing something. Maybe a full plan. Maybe a hint like OPTION(MAXDOP 1)
.
For the other queries there are plan guides, so they get the plans that SQL Server thinks is the best. I note that the first query has an estimate cost of 11 (hover over the SELECT operator and view Estimated Subtree Cost), so I guess the plan guide is explicitly turning off parallelism. The second query, on the other hand, is just barely above the limit of 5.
Beware that a plan guide is only for the exact query. Add some spacing and it will no longer match. And even less if you logically change the query.
Of the other two queries, I prefer NOT EXISTS over NOT IN. NOT IN is one to be careful with, because it can lead into surprises if there are NULL values involved.
I made one observation in the query plan XML that I like to call out:
You are running the release version of SQL 2016 which is grossly outdated. You should download and install the last Service Pack for SQL 2016 which is SP3. There is also one Cumulative Update that you should apply, and some security fixes on top of that. This will give you access to many bug fixes and enhancements.