See my post about polymorphism. To "pass in an expression in on the fly" you need to wrap the function in a polymorphic class and "on the fly" pass a reference to that class instead. For example if you are doing this in a ChuGen you can create a class variable to hold a reference to the "current" expression object. At the appropriate time you can assign a new class to the reference variable in much the same way you would change the gain or frequency on the fly. The tick() method would call the current function through the reference variable. You can then put the common code directly in the ChuGen and code you want to change at run time in the referenced object.
This is all simpler if all classes are defined in the same file and thread but I believe that if you are clever the new code doesn't even need to be defined when the ChuGen is started. All it needs is for the base class to be defined. You could connect and start up the ChuGen and then weeks later write new code and put it into the reference variable of the running ChuGen. The tricky part is how to pass the new object from a different thread. This requires using static class variables which is a subject for a different post.
-steve
PS all the helper functions you can imagine are probably already written and available in the LiCK Library for ChucK. If you don't have it already you should get it immediately. Half the things I was originally planning of writing in ChucK I found already implemented in LiCK. It is also a great thing to read if you want to see how complex things can be done in ChuCK.