Independientemente de lo que elija, tenga en cuenta que el código corto no siempre es el código óptimo. En muchos casos, donde tiene una lógica lo suficientemente divergente, la unión de los resultados es realmente la opción más óptima (y, a veces, la más limpia programáticamente).
Dicho esto, el siguiente OR en la cláusula WHERE parece cubrir ambos casos...
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")