so I don't want ODE to be doing extra work for 3D and then applying a 2D constraint
Well, ode is very fast for 2d and 3d. So really, there shouldn't be a problem with speed. You will need to apply your own 2d constraints, but the calculations shouldn't be a problem. Again, profile and see...
The only extra feature I need, is to specify different directions for friction. ie. For a car, I want the sideways friction to be greater than the forward and backward friction
Yup, this can be done using contact parameters:
contact.setMode(Ode.dContactApprox_1 | Ode.dContactMu2);
Mu is a friction coeffecient which can also be used as the maximum force applied to the bodies as friction. Mu is in the direction of the contact, Mu2 is in sideways friction you speak about. And the normal is the normal of the two mu directions...
Well, using ode is far far better than rolling out your own..