PostgreSQL: Use column with hash based on other columns as unique index?
You could use a UNIQUE INDEX instead of the UNIQUE CONSTRAINT using the function coalesce to treat null as a regular value for your uniqueness:

CREATE UNIQUE INDEX ON offer (
       product_id,
       coalesce(price_old,-1),
       coalesce(price,-1),
       coalesce(price_alt,''),
       valid_from,
       valid_to);


This will enforce your uniqueness as you described.

For details between a Unique constraint and a unique index,see:
https://stackoverflow.com/questions/23542794/postgres-unique-constraint-vs-index