I see two different possibilities:
1. Define a cylinder as a your base mesh, using radius = 1.0 and height = 1.0. Then you could use this as the instance basis, and then just pass the per-instance data that is needed to scale the cylinder and place it where you want it in the proper orientation (i.e. a transformation matrix only, since you can do a scale in Y for scaling the height, scale in X and Z for radius, then the standard rotation and translation can all be concatenated into one matrix). This should be very efficient, with the vertex shader simply being a single transformation, and it should be faster than one draw call for each cylinder (plus a significant reduction in vertex buffer size needed).
2. You can try to use imposters if the precision isn't too strictly needed. This is essentially rendering a few cylinders into textures, and then you use billboards to put them into the correct location within your scene. This would be hard to get working in an acceptable quality, but could be very fast if it meets your requirements...
I would prefer #1, but your mileage may vary!