I was intrigued by this. Adding to @Avoma's analysis, the problem is that there is a discrepancy between theĀ onGround argument, which is true when the boat has landed, and this.status. The status is updated every tick, to either IN_AIR or ON_LAND (for the relevant problem; other values are possible otherwise).
So most of the time, we're entering checkFallDamage with onGround true, and the boat's status says it is in the air, so we reset the fall distance and do nothing else. But due to timing, in some situations the tick update has managed to set our status to ON_LAND, and we go on to do the "deal damage to passengers, replace boat with planks and sticks".
The correlation with heights is therefore more incidental; the real cause of when this happens is how the call to checkFallDamage correlates to how the last tick has set the status to ON_LAND.
The solution though, seems simple enough. The replacement of the boat with planks and sticks is a remnant from a very old behavior. There is no need to check anything else apart from the
onGroundargument, and then always reset the fall distance, regardless of the value ofthis.status.One could hope that a Minecraft engineer gets to spend a few minutes on fixing this.