As far as your query uses a LEFT JOIN b ON a.id = b.id
you can change your WHERE clause to WHERE (a.val != b.val)
because you wont receive any record where a.id <> b.id
That said, to divide the results you can use a UNION by selecting all records from table a, plus all records from table b that match your WHERE clause.
create table a (id int, val varchar(10));
create table b (id int, val varchar(10));
insert into a values (1,'aaa'),(2,'bbb'),(3,'ccc'),(4,'ddd');
insert into b values (1,'ddd'),(5,'bbb'),(3,'xxx'),(7,'ddd');
GO
8 rows affected
SELECT * FROM a left join b on a.id = b.id WHERE ( a.id != b.id or a.val != b.val)
GO
id | val | id | val
-: | :-- | -: | :--
1 | aaa | 1 | ddd
3 | ccc | 3 | xxx
SELECT a.* FROM a left join b on a.id = b.id WHERE (a.val <> b.val)
UNION
SELECT b.* FROM a left join b on a.id = b.id WHERE (a.val <> b.val)
GO
id | val
-: | :--
1 | aaa
1 | ddd
3 | ccc
3 | xxx
dbfiddle here
left join on a.id = b.id
wont return any (a.id <> b.id)