Does Postgres handle JOIN queries differently? Yes, in a way. The difference is not specific to PostgreSQL but rather to SQL's three-valued logic (TRUE, FALSE, NULL) and how NULL interacts with conditions:
In a simple query, NULL != 'spam' results in NULL, which is not explicitly excluded, so those rows still appear. In a JOIN query with a WHERE clause, NULL != 'spam' causes rows to be excluded because the WHERE clause only keeps TRUE values. This is a fundamental SQL behavior, not a Postgres-specific feature.