So basically I want to make a swimmer move around underwater obstacles. However, PathfindingService only seems to work when there's a solid surface to move on. Is there a way to either have PathfindingService ignore water and move in 3D, or take swimming in water into account?
You can't
It's just not implemented in that way. What you can do is you can implement your own by having your own nodes to avoid or follow. This requires a bit of work on your end, but it will actually ultimately be a bit faster and a ton more flexible.