2 DEPENDENT SUBQUERY tbl_postcodes ALL (NULL) (NULL) (NULL) (NULL) 15372 Using where; Using temporary
The list of NULL's normally contain the names of the indexes that the database can use to solve the query, and a list of indexes that it has actually decided to use.
The fact that there are all NULL's suggests that there are no indexes that can be used to find, and the filesort and temporary mean that the database is basically just loading all the records, sticking them in a tempporary table on disk and sorting them there (filesort).
Adding separate indexes to ownerpostcode, _TerritoryID field and "Postcode" may help.
The weird thing is that the subquery runs in a flash when run by itself.
That's because the subquery just plows through all the records and remembers the unique postcodes. That's easy.
Your outer query searches through all the owners once for every postcode and because there probably is no index on the ownerpostcode the database will be forced to loop through all owners once for every postcode.
Suburbs can have the same Postcode.
Hmmm.. that's to bad, but it does mean that your DISTINCT is justified. You could try normalizing the postcodes into a separate table but I doubt that that will make much difference (and it's a lot more work for your application) so try an index and see if that helps.