Your guess is correct. Using OptiX, you can setup your own bounding box and intersection programs to render curves. There are many different approaches you can take, and which one you choose depends on your needs.
You can pre-tessellate curves, which is fast to render but uses a lot of memory. At the other extreme, you can write an implicit curve intersector that is either iterative or recursive. That will use very little memory (you only need to have your control points in a buffer) but comes with some math complexity and divergence issues. Subdividing into cylindrical segments or using camera facing ribbons is somewhere in between those two approaches. The main concern with camera facing ribbons is making sure they work the way you want for shadows & reflections; you may want the intersector to always be ray-facing rather that camera-facing so the curve always appears to occupy the same volume from any angle.
You might be interested in this paper, which includes some of the CUDA code for the intersection program of a cubic Bezier curve with a circular profile and varying radius: