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.