I would not recommend using a meshCollider for this. They're one of the more expensive types of collider to process, and every time you move the vertices the physics engine will need to recalculate all its acceleration structures that try to make looking up the right colliding triangles faster. You'll likely burn a ton of CPU this way.
One method I've seen used is to attach "floaters" to objects that are meant to float in the water. These behave like a virtual flotation device, exerting forces on the object according to their degree of immersion in the water.
Each physics update, each floater samples the water height at its position (eg. by evaluating the same wave function you use in the shader). If the floater is fully above the water, it exerts no force on its parent body. If the floater is partially or fully immersed (you can analytically model the floaters as spheres with a particular radius, for example), it calculates the total buoyancy force according to how much of it is underwater, and applies it as an upward force on the parent body, applied at its point of attachment.
These floaters can also compute & apply viscosity drag forces or lateral currents in a similar way. If you compute the local (low frequency) gradient vector of the waves, you can tilt the axis on which you apply these forces to push outward from larger sea swells.
With these, a floating object will not collide with the water like a solid floor, but ride within it on a fluid cushion spring. By adding more floaters distributed around your object, you can simulate more complex buffeting by waves (as eg. the starboard bow floaters take the wave first, causing the ship to lurch from the uneven forces on it)
Similarly for effects spawned at the water's surface - I wouldn't count on collision tests and raycasts to place them. Instead, sample your wave height function at the x/z coordinates of the effect and snap it to that height.