The output of hvplot is not an Overlay but an NdOverlay. You should be able to just do this, though: df.hvplot(...).opts(legend_opts=dict(click_policy='hide'))
Weirdly, I had it inside the hvplot(…) args, and it wasn’t working in my real use-case, but does seem to work now. Must have been my error.
For anyone else who comes here, this is my summary:
plot = df.hvplot(
# ... other args ...
# OK
#legend_opts=dict(click_policy='hide'),
).opts(
# OK
legend_opts=dict(click_policy='hide')
# OK
#hv.opts.NdOverlay(legend_opts=dict(click_policy='hide'))
# Bad
#hv.opts.Overlay(legend_opts=dict(click_policy='hide'))
)