After a bit of annoyance with nevow:attr, I did figure out how one works with it, but in doing so, I found what seems to me to be a far more reasonable approach. Rather than having an extra nevow:attr tag, with a slot inside it that you fill from your render method, you can simply alter the tag in your render method directly using its attributes field:
ctx.tag.attributes['onchange'] = livepage.handler(
livepage.js('getValue')( globalID )
and then return ctx.tag as the result of the render method. Works perfectly well, and seems less cumbersome than the nevow:attr approach.