after you create the Axis, all its internal observables exist already. While usually observables are changed with observable[] = newcontent for Makie attributes we don’t force people to write the empty index notation all the time.
So what you wrote is equivalent to ax.attributes[:title][] = titlestr, so you’re setting the content of an observable to an observable. You want to create the observable first and pass it to Axis so it gets used directly.
ax = fig[1, 1] = Axis(fig, title = titlestr)
Or you change the existing observable whenever titlestr changes, but that is less elegant:
on(titlestr) do t
ax.title = t
end