Cokolwiek wybierzesz, pamiętaj, że krótki kod nie zawsze jest optymalnym kodem. W wielu przypadkach, gdy masz wystarczająco rozbieżną logikę, łączenie wyników jest naprawdę najbardziej optymalną (a czasem najczystszą, programowo) opcją.
To powiedziawszy, poniższe OR w klauzuli WHERE wydaje się obejmować oba Twoje przypadki...
SELECT DISTINCT
shops.*,
DA.delivery_cost,
DA.postcode AS AreaPostcode
FROM
shops
INNER JOIN
shops_delivery_area as DA
ON (DA.shop_id = shops.id)
WHERE
(DA.postcode = "Liverpool")
OR
(DA.postcode = shops.postcode AND shops.location = "Liverpool")