Ok, so I discovered the transforms in the matplotlib docs, and this works. Not exactly trivial, but that's ok. The graph produced here is reversed from the example: the top has the short x-axis. The concept ok though.
import matplotlib.pyplot as plt
short_ax_lim = 4.
f, (top_ax, bottom_ax) = plt.subplots(2,1,figsize=[9,5])
bottom_ax.set_xlim(0,5)
top_ax.set_xlim(0,short_ax_lim)
# first find the pixel where the bottom x-axis equals the desired limit.
short_ax_stop_pix = bottom_ax.transData.transform((short_ax_lim,0)) # (x,y) in pixels at data point (0,4)
short_ax_stop_fig = pix_to_fig.transform(short_ax_stop_pix) # (x,y) in figure space (0,1)
top_orig_position_px = top_ax.bbox.corners() # (ll, ul, lr, ur)
top_orig_anchor_px = top_orig_position_px[0] # this is lower left corner.
top_orig_anchor_fig = pix_to_fig.transform(top_orig_anchor_px) #convert to figure space
top_x_anchor, top_y_anchor = top_orig_anchor_fig
top_width = short_ax_stop_fig[0] - top_x_anchor
new_pos = (top_x_anchor, top_y_anchor, top_width, top_ax.get_position().height)
top_ax.set_position(new_pos)
f.show()