Create a view containing multiple rows per customer
You can use a LATERAL join to rewrite the view:

CREATE VIEW tasks AS
SELECT c.customer_id, t.*
FROM customers AS c,
     LATERAL
     (   SELECT  1::int, c.created, c.confirmed   
       UNION ALL
         SELECT  2, ---
         WHERE ---
       ...
       UNION ALL
         SELECT 12, c.invoice_paid, c.invoice_registered
         WHERE c.has_invoice
     ) AS t (task_id, since, done)
WHERE c.cancelled IS NULL ;


Adding a filtered index on (customer_id) WHERE (cancelled IS NULL) should  improve efficiency (perhaps of the existing view as well, although I'm not sure if the condition will be pushed down through the UNION) for the query you use:

SELECT * FROM tasks WHERE customer_id = 12 ;