As for robot_pose_ekf, it relies on its incoming sensor data to perform its calculations. Wheel odometry is always 2D, just by the nature of it. Your IMU data can publish a 3D orientation to robot_pose_ekf, but the robot's elevation (z-value) will never change until you have a source that publishes a z-value. I'm not sure if robot_pose_ekf will rotate the 2D plane of wheel odometry to a world reference frame (so that the IMU's orientation can influence elevation), since I've never used it. I'm just speaking from general experience when I say that I'm not sure that it does.
That leaves your GPS and visual odometry to publish elevation data. I can't speak for everyone, but I never take the z-measurement from my GPS unit (if you're using one). I find it to be terribly unreliable. That leaves only /vo (visual odometry) as your source for elevation calculations. If you publish a z-value to /vo, you should be able to achieve 3D navigation.