Having talked about this to a couple of people offline who have some experience with mapping, we have a working theory (though I'll not accept my own answer unless+until others confirm these ideas).
As mentioned in the other answers and comments the altitude is not coming from the GPS readings. Because satellites are essentially on the same plane (relative to the sideways difference in their locations) altitude calculations have such a high error range that (at least on consumer-grade phone/watch style devices) they are at best general indicators. For this reason, again also alluded to in other answers/comments, reference map data is used instead.
There is effectively an altitude difference of the road either side of the river, the south side is lower at the point that the height mapping data becomes available than the north side at the point that the height mapping data becomes available.
The available height data is the issue - in the sources used there is nothing (not even a reading of the riverbed height) for the bulk of the bridge. The data used only contains data for land that is at least mostly permanently above water. If you look at the trace either side (I didn't notice this before) you can see it going down as if it is following the river floor not the road height. Where this is no data the height of the closest point with data is used. The closest point with data switches about half way over which is why there is a sudden change, because as per point 2 there is is difference in altitude between those last points with altitude data.
So to summarise what happens going south:
Approaching the bridge area all is well, we have height mapping data that matches where the road it.
The height data is following the land not the road so moving onto the bridge you initially see the downwards curve of the riverside not the upwards rise of the road.
At a certain point the height data stops, so the last/nearest point with data is used for the altitude reading. You can see this in the trace as a flat line.
In the middle of the bridge that point is no longer the nearest, son on the first trace a point on the south side is so its altitude is used (see below for why we think the details here differ on the second trace). This causes the precipitous change in the chart.
Again there is the flat reading, as there is not real altitude data so that nearest point is used as a best guess.
Once there is altitude data available, it again follows the land not the road and you see the rising curve of the river bank.
Once beyond that curve we are no longer elevated above the land by a raised section of road and the trace is again following both the lay of the land and the road.
Exactly the same occurs in reverse on the return leg of course.
The two half-marathon traces I included seem to be using slightly different map data. On the trace taken from my trip the riverside is an obvious curve and the "no data" section is shorter. On the other trace the altitude data stops closer to the sides of the river so the flat parts of the trace are longer. Also it seems that instead of using the nearest point on the map for which there is data it is using the last point visited for which there is data, so the sudden change in altitude occurs when altitude data "appears" again (near the sides of the river) rather than half way between the points where there is data, so near the end of the bridge the traveller is heading towards rather than in the middle of the bridge. The trace on the full marathon PDF is a little different again because the traveller never goes further south then the bridge exit, immediately turning under the bridge to join the other carriageway to go back north.
Comments? This seems to make sense in our heads at least...