I don't sql-server know well enough to state whether it works this way or not, but in theory there is no way you can say that one part of the union is evaluated before another. I.e. even though you have a perfect match, you may still end up with an approximate one.
You can however force this behavior by adding a priority to each part of the union and order by that. Something like:
SELECT TOP 1 *
FROM (
-- Unique suburb-postcode-state combinations
SELECT 1 as prio
,s.Suburb_DID
,s.Suburb
,s.State
,s.Postcode
,Geocode_DID = 4 -- Exact match by unique Postcode, Suburb and State
,s.Geocode_Latitude
,s.Geocode_Longitude
FROM geocode.tSuburbs_XX s
INNER JOIN [geocode].[tGeocode_Methods] gm
ON s.Geocode_DID = gm.Geocode_DID
WHERE s.[Is_Active] = 1
AND s.[Suburb] = @Suburb
AND s.[State] = @State
AND s.[Postcode] = @Postcode
-- Only suburbs that are geocoded with methods that can be used for geocoding customers
AND gm.[Can_Use_For_VIP] = 1
UNION ALL
-- -- Unique suburb-postcode combinations
SELECT 2 as prio
,s.Suburb_DID
,s.Suburb
,s.State
[...]
) t
order by prio
Now you will get - one of - the row with the smallest prio in return. Note that the DBMS may still evaluate other options so there is no guarantee that it will perform better.
Another idea is to pipeline the parts via CTE's in the order of preference:
with t1 as (
-- Unique suburb-postcode-state combinations
SELECT 1 as prio
,s.Suburb_DID
,s.Suburb
,s.State
,s.Postcode
,Geocode_DID = 4 -- Exact match by unique Postcode, Suburb and State
,s.Geocode_Latitude
,s.Geocode_Longitude
FROM geocode.tSuburbs_XX s
INNER JOIN [geocode].[tGeocode_Methods] gm
ON s.Geocode_DID = gm.Geocode_DID
WHERE s.[Is_Active] = 1
AND s.[Suburb] = @Suburb
AND s.[State] = @State
AND s.[Postcode] = @Postcode
-- Only suburbs that are geocoded with methods that can be used for geocoding customers
AND gm.[Can_Use_For_VIP] = 1
), t2 as (
- -- Unique suburb-postcode combinations
SELECT 2 as prio
,s.Suburb_DID
,s.Suburb
,s.State
[...]
WHERE NOT EXISTS ( SELECT 1 FROM T1 )
), t3 as (
[...]
WHERE NOT EXISTS ( SELECT 1 FROM T1 UNION SELECT 1 FROM T2 )
)
select * from t1
union all
select * from t2
union all
[...]
The optimizer may be smart enough to understand where to stop.