L'esempio fornito può essere completamente sostituito con RETURN QUERY :
BEGIN
RETURN QUERY SELECT y_.y, 'hi' FROM generate_series(1,10,1) AS y_(y)
END;
che sarà un lotto più veloce.
In generale, dovresti evitare l'iterazione ove possibile e preferire invece le operazioni orientate ai set.
Dove return next su un ciclo è inevitabile (cosa molto rara e per lo più confinata a quando è necessaria la gestione delle eccezioni) devi impostare OUT valori dei parametri o parametri della tabella, quindi return next senza argomenti.
In questo caso il tuo problema è la riga SELECT yr.y, 'hi'; che non fa niente. Stai assumendo che la destinazione implicita di un SELECT è il parametro out, ma non è così. Dovresti usare i parametri out come variabili di ciclo come ha fatto @peterm, usare le assegnazioni o usare SELECT INTO :
FOR yr IN SELECT * FROM generate_series(1,10,1) AS y_(y)
LOOP
RAISE NOTICE 'Computing %', yr.y;
y := yr.y;
result := 'hi';
RETURN NEXT;
END LOOP;
RETURN;