Update, 14.03.14: I had some issues with this technique when used inside a ExtLib dialog. I suspect this has something to do with the dialog having it's own form. To make it work inside the dialog, I added a parameter for the execId. If I remember correctly, execId specifies the part of the XPages tree that should be processed. It can be the same as the target of the refresh.
Example of use with execId:
XSP.partialRefreshPost( '#{id:targetOfRefresh}', { execId: '#{id:targetThatShouldBeProcessed}' } );
I had some issues getting partial refresh triggered by radio buttons to work as I wanted to across browsers. I found a simple workaround. Instead of specifying the partial refresh in the event handler, I set no submission for the server side part, and execute a slightly delayed XSP.partialRefreshPost from the client side event action:
<xp:radioGroup id="someId" value="#{document.someField}" defaultValue="yes">
<xp:eventHandler event="onclick" submit="false">
<xp:this.script><![CDATA[setTimeout( function(){
XSP.partialRefreshPost( '#{id:targetOfRefresh}' );
}, 50 );]]></xp:this.script>
</xp:eventHandler>
<xp:selectItem itemValue="yes" itemLabel="Yes" />
<xp:selectItem itemValue="no" itemLabel="No" />
</xp:radioGroup>
This seems to work nicely across the browsers I tested in, regardless of triggering the value change through the radio button or the label.