Your question is a typical use case of window functions. But no built-in window function exists for the multiplication or division, so you can either follow the answer of @shawnt00 using the sum() aggregate, or you can create your own aggregate based on the division operator :
CREATE OR REPLACE FUNCTION division (x anyelement, y anyelement, z anyelement)
RETURNS anyelement LANGUAGE sql AS $$ SELECT COALESCE(x,y)/z $$ ;
CREATE OR REPLACE AGGREGATE division_agg (x anyelement, z anyelement)
(sfunc = division, stype = anyelement) ;
Then you can use your new aggregate division_agg in a query :
SELECT day, growth_rate
, COALESCE(division_agg(target, growth_rate) OVER (ORDER BY day DESC ROWS BETWEEN UNBOUNDED PRECEDING AND 1 PRECEDING), target)
FROM test
ORDER BY day
The division_agg window function divides the initial target value which corresponds to the highest day because of the ORDER BY day DESC clause successively by all the growth_rate values of the window associated to the current row, ie all the rows with a highest day, except for the row with the highest day for which the window is empty, so division_agg returns NULL which is replaced by the target value thanks to the COALESCE() function.
See the full demo in dbfiddle.