The difference is that the condition is logically evaluated, which in turn can affect the result set.
In your examples (reformatted) you have:
Example 1
SELECT COUNT(*) FROM A LEFT JOIN B ON a.id = b.id WHERE a.status = 2 AND b.id is NULL
Example 2
SELECT COUNT(*) FROM A LEFT JOIN B ON a.id = b.id AND a.status = 2 WHERE b.id is NULL
In the first case, a LEFT JOIN is applied and a result set is created; it is then filtered with two conditions in the WHERE clause.
In the second case, the LEFT JOIN is formed with the filtering condition on a.status and in some cases can change the result set from the LEFT JOIN. This result set is then filtered with the main WHERE clause.
Example 2 is essentially equivalent:
Example 2A
SELECT COUNT(*) FROM (SELECT * FROM A WHERE a.status = 2) AS A LEFT JOIN B ON a.id = b.id WHERE b.id is NULL
With some queries (but probably not with this) the difference can make a difference.
Try creating some simple sample data:
Table A Table B id status id 4 2 1 5 3
Example 1 will have an intermediate result set:
a.id a.status b.id 4 2 null 5 3 null
and the WHERE clause excludes the second line.
Example 2 will have an intermediate result set:
a.id a.status b.id 4 2 null
In this example, the net result is the same, and I could not find data that did not match.
If the query condition that is moving is in an outer joined table and is more complex than simple equality, then you can see the effect.