It's because the join has the ability to multiply rows. Look at the following tables:
TableA
Cust Value
1 1
1 2
2 1
TableB
Cust
1
1
2
When you join the two you get
a.Cust b.Cust Value
1 1 1
1 1 1
1 1 2
1 1 2
2 2 1
So if you count these values you get 5 where are using the in you get that same dataset as TableA so the count is 3.
If you run this SQL:
SELECT SUM(COUNT(*) - 1) diff, COUNT(*) total, sel_col FROM t2 GROUP BY sel_col HAVING COUNT(*) > 1
If this returns any results it means your count is being multiplied by the join. The diff column in the result will equal the difference between the two results.
If you need a join with the same result as the in, try the following.
SELECT COUNT(t1.sel_col) FROM t1 (NOLOCK) INNER JOIN (SELECT DISTINCT sel_col FROM t2 (NOLOCK)) t2
Joining to the sub query when the sub query is distinct will reduce duplicates and the multiplying effect of the join.