You can't substitute a var into a string like that. Without using dynamic SQL, the cleanest way is a multiplier:
r.duedate := alert_start_period + i * INTERVAL '1' MONTH;
However, this whole idea is ugly. The loop is unnecessary. Use:
generate_series(alert_start_period, alert_start_period + INTERVAL '12' MONTH, INTERVAL '1' MONTH)
to generate the intervals. If you must, you can loop over that, but I generally find that everything not requiring exception handling is better done as normal set operations rather than pl/pgsql loops.