I realise that. I think I didn't explain my objective properly:
What I do now is, as you suggest, use setenv:
local X.X.X.X
setenv ip_local X.X.X.X
This allows the client-connect script to figure out which OpenVPN process (or which public IP) the client connected to by looking at $local_ip. However this solution means I have to run multiple OpenVPN processes, one for each public IP address. Double that if I want to run both UDP and TCP versions.
With other VPN methods (e.g. pptpd, strongswan, etc.) the client-connect script is passed a local_ip variable (or something similar) generated by the VPN software itself, based on the actual connection made by the client. This allows you to use just 1 single process that binds on all public IP addresses and still differentiate in the client-connect script depending on which public IP the client connected to.