Joel,
El codeblock te está manteniendo el último valor de i. Tienes que usar lo que se denomina "detached locals":
oDlg:aControls[i]:bAction:= GenBlock( oDlg, i, Self )
...
function GenBlock( oDlg, i, Self )
return {|nId| ::PutVal(oDlg:aControls[i]:cTitle) }