Here’s a solution that is closer to what you probably want. I based it on the following Bokeh discourse topic. https://discourse.bokeh.org/t/how-to-set-the-width-of-a-legend/2332
Basically set the label_width property in the legend constructor to something that will encompass the largest entry you expect. Expand the width of the corresponding plot to account for that label entry. I also added some padding to undo additional compression due to borders and such. If you wanted to be precise you might be able to come up with a delta based on the actual contributing factors like margins, etc. I just eyeballed it to give a starting point.
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
"""
"""
from bokeh.layouts import gridplot
from bokeh.models import CategoricalColorMapper, Legend
from bokeh.palettes import Category10
from bokeh.plotting import figure, show
from bokeh.sampledata.iris import flowers
color_mapper = CategoricalColorMapper(
factors=[x for x in flowers['species'].unique()], palette=Category10[10])
p1 = figure(height=350, width=350)
p1.circle("petal_length", "sepal_length", source=flowers,
color=dict(field='species', transform=color_mapper))
llpx = 100
dpx = 65
p2 = figure(height=350, width=350+llpx+dpx)
p2.add_layout(Legend(label_width=llpx), 'right')
p2.circle("petal_length", "petal_width", source=flowers, legend_group='species',
color=dict(field='species', transform=color_mapper))
show(gridplot([p1, p2], ncols=2))