Here’s how I would do it. The main change is in the first CustomJS.
from bokeh.io import show
from bokeh.layouts import column
from bokeh.models import ColumnDataSource, CDSView, BooleanFilter, CustomJSTransform, MultiSelect, CustomJS
from bokeh.plotting import figure
from bokeh.transform import transform
p = figure()
ds = ColumnDataSource(dict(x=list(range(10)),
                           y=list(range(10)),
                           names=['a', 'b', 'c', 'c', 'd', 'd', 'a', 'a', 'c', 'c'],
                           name_id=['a-5', 'b-1', 'c-1', 'c-1', 'd-1', 'd-1', 'a-2', 'a-5', 'c-2', 'c-2']))
options = sorted(set(ds.data['names']))
initial_value = [options[0]]
b = BooleanFilter([x in initial_value for x in ds.data['names']])
ms = MultiSelect(title='MC Experiment:', value=initial_value, options=options)
id_options = sorted(set(i for n, i in zip(ds.data['names'], ds.data['name_id'])
                        if n in initial_value))
initial_id_value = [id_options[0]]
b_id = BooleanFilter([x in initial_id_value for x in ds.data['name_id']])
ms_id = MultiSelect(title='ID:', value=initial_id_value, options=id_options)
ms.js_on_change('value', CustomJS(args=dict(f=b, source=ds, columnName='names', ms_id=ms_id),
                                  code="""\
                                      const val = cb_obj.value;
                                      f.booleans = Array.from(source.data[columnName]).map(d =>  val.includes(d != null && d.toString()));
                                      const id_options = [...new Set(source.data.name_id.filter((_, idx) => f.booleans[idx]))];
                                      id_options.sort();
                                      
                                      // New lines.
                                      ms_id.options = id_options;
                                      ms_id.value = [id_options[0]];
                                      
                                      source.change.emit();                                      
                                      """))
ms_id.js_on_change('value', CustomJS(args=dict(f=b_id, source=ds, columnName='name_id'),
                                     code="""\
                                      const val = cb_obj.value;
                                      f.booleans = Array.from(source.data[columnName]).map(d =>  val.includes(d != null && d.toString()));
                                      source.change.emit();                                      
                                      """))
view = CDSView(source=ds, filters=[b, b_id])
tr = CustomJSTransform(v_func="return xs.map(x => 10 * x);")
p.scatter('x', transform('y', tr), view=view, source=ds, color='red')
show(column(p, ms, ms_id))