If you join the tables on Col1 e.g.
select A.Col1 AS Col1, A.Col2 as Col2, [status]
From TableA A
left outer join TableB B on A.Col1 = B.Col1
you get the following ...
1 A1 1
1 A1 1
2 A2 0
2 A2 1
3 A3 1
4 A4 NULL
(I added an extra row to the parent table for which there were no child table entries just to test my query). I.e. you get 0,1, or 2 rows in the results per row on the parent table.
You can use that output with PIVOT to get the data as you have presented it
select Col1, Col2, [1] as ActiveCount,[0] as InactiveCount
FROM
(
select A.Col1 AS Col1, A.Col2 as Col2, [status]
From TableA A
left outer join TableB B on A.Col1 = B.Col1
) AS src
PIVOT
(
count([status]) for [status] in ([0],[1])
) as pvt
It's reasonably efficient and can be made more so if there are appropriate primary and foreign keys defined
For further reference see
Visual Representation of SQL Joins[
^]
SQL Wizardry Part Seven - PIVOT and arbitrary lists of data[
^]
Database performance optimization part 1 (Indexing strategies)[
^]