I've never used kohana, so apologies if this comment is completely irrelevant, but I have a few comments about what you are trying to do:
When I use a named param for table name, it fails.
I assume that this is because it is relying on the underlying database's parameter mechanism, and I don't know of any database that allows you to give a table name as a parameter in a query. So yes, most likely you'll have to build a string yourself.
how can I escape potentially bad characters when doing this kind of string building?
This question seems strange... either you have potentially bad characters in some of your table names... if so, why? Or else you're receiving the table name from an untrusted source (user?). This sounds like a bad idea to me. What if they try to read from a table they weren't supposed to have access to? Wouldn't it be better to have a well defined list of allowable tablenames and check that the table exists in that list, instead of escaping potentially bad table names?
And I have one final observation: if you are able to change the table name in a query and it still works, this is possibly a sign that your database is not normalized correctly. Perhaps you could combine your tables and add an extra column with information about the grouping, and use a WHERE clause to select the data you want? I'd need to know more about your model to suggest something more concrete.
I'm not sure if this helps answer your question at all, but these were my thoughts on reading your question. I hope you can use some of it.