Something like this? Create a “format dictionary” of your unit conversions and pass that to a CustomJS callback that applies it. This example takes it 90% of the way there, but what I can’t get to work is for the slider’s format to update “immediately” upon changing the Select widget’s value → that update isn’t occurring until you move the slider -->sl.change.emit() and sl.format.change.emit() don’t do anything here… not sure what I’m missing there.
from bokeh.models import FuncTickFormatter, Slider, Select, CustomJS
from bokeh.plotting import show
from bokeh.layouts import column
sel = Select(title='Units',value='m/s',options=['m/s','km/h'])
fmt_dict = {'m/s':FuncTickFormatter(code="""
return tick.toFixed(1)+' m/s'
""")
,'km/h':FuncTickFormatter(code="""
return (tick/3.6).toFixed(1)+' km/h'
""")}
sl = Slider(start=0,end=10,step=1,value=0,title='Speed',format=fmt_dict['m/s'])
cb = CustomJS(args=dict(sel=sel,sl=sl,fmt_dict=fmt_dict)
,code='''
var new_format = fmt_dict[sel.value]
sl.format=new_format
//this doesn't do anything.... want to get the new format applied here
sl.change.emit()
sl.format.change.emit()
''')
sel.js_on_change('value',cb)
show(column([sel,sl]))

Anyway hope this helps.
EDIT LOL I am aware I got the actual conversion between m/s and km/h backwards