The most common way that people do this is to use either robot_pose_ekf or robot_localization (more common these days) to fuse together the IMU and odometry data, and publish the fused result as a new tf frame. Then you can specify the ~odom_frame_id in amcl to be this new filtered frame (usually called /odom_combined with robot_pose_ekf and /odom_filt for robot_localization).