Thanks for the quick feedback and illustrative example.
Perhaps your counter-example works because the models are all part of the same gridplot container. In my example, I have two roots (each a tab panel) that are sequentially added to a bokeh document, and it appears the second one is layered on top of the first.
I made modest modifications to your example to test that hypothesis, and can recreate the issue with the attached code (run as a bokeh server session). See also attached screen capture.
# -*- coding: utf-8 -*-
from bokeh.io import show
from bokeh.layouts import gridplot, column, row
from bokeh.models import HoverTool
from bokeh.plotting import figure, curdoc
ht = HoverTool(tooltips='<div style="width: 1000px; height: 1000px; background-color: teal;">Tooltip</div>')
p1 = figure(tools=[ht])
p2 = figure(tools=[ht])
p3 = figure(tools=[ht])
p4 = figure(tools=[ht])
for p in [p1, p2, p3, p4]:
p.circle(x=[0, 1, 1, 0], y=[0, 0, 1, 1], size=100)
#show(gridplot([[p1, p2], [p3, p4]]))