Should I duplicate columns between tables to speed-up aggregations like SUM?
DB design
Seems like a 1:n relationship between waste_card and wastes. Actual table definitions (CREATE TABLE statements) would clarify.
Do not repeat (duplicate) the columns user_id, manufacture_date, and address_id in the many-table wastes. That would bloat your table, introduce problems with maintenance, raise the question which is the true source of information, blatantly defy normalization etc.
Queries
While computing a total sum, just use a plain [INNER] JOIN. Wastecards with no related entries in waste don't change the result and can be excluded:
SELECT SUM(w.amount) AS total_waste
FROM   waste_card wc
JOIN   wastes     w  ON w.waste_card_id = wc.id
WHERE  wc.user_id = $1 
AND    wc.manufacture_date &lt; $2
AND    wc.address_id = $3;

LEFT JOIN makes sense to ...

list the sum per entry in waste_card
and include cards with no entries in waste

But then it's typically better to use a LATERAL subquery computing the sum per card. The aggregate function guarantees exactly one row from the subquery so we can just as well switch to CROSS JOIN LATERAL (like Andriy pointed out):
SELECT wc.*  -- or better just the columns you need
     , w.sum_waste
FROM   waste_card wc
CROSS  JOIN LATERAL (
   SELECT SUM(w.amount) AS sum_waste
   FROM   wastes w
   WHERE  w.waste_card_id = wc.id
   ) w
WHERE  wc.user_id = $1 
AND    wc.manufacture_date &lt; $2
AND    wc.address_id = $3;

See:

JOIN (SELECT … ) ue ON 1=1?

Fastest way to count how many dates&#39; ranges cover each date from series

Convert right side of join of many to many into array


Covering index
To speed up either query, an index &quot;covering&quot; wastes.amount might pay (requires Postgres 11 or later):
CREATE INDEX your_idx_name ON wastes(waste_card_id) INCLUDE (amount);

For Postgres 10 or older, fall back to a multicolumn index:
CREATE INDEX your_idx_name ON wastes(waste_card_id, amount);

See:

Does a query with a primary key and foreign keys run faster than a query with just primary keys?

Do covering indexes in PostgreSQL help JOIN columns?



Aside:  LIMIT without ORDER BY (like in your first query) produces arbitrary results. Typically you want to add ORDER BY to determine results.