I haven't tried it, but I'm pretty certain that isImmutable won't do the trick. Assuming that does actually make an object immutable, it will make the object pointed to by the instVar immutable, not the instvar itself.
Your best bet is to simply not include a specific Mutator for the variable at all, but to instead set it at initialization time like this:
MyClass class>>newWithFoo: aFoo
^self basicNew initializeWithFoo: aFoo; yourself
MyClass>>initializeWithFoo: aFoo
self initialize.
foo := aFoo.
That way, the only way anyone outside the class itself can affect the variable is by creating a new instance by calling MyClass newWithFoo:
(Not counting using reflective methods like #instVarNamed:put:
- there's pretty much nothing you can do about them, but anyone using them knows they're breaking the contract of the class anyway).