Aqui está uma solução que se baseia em várias das outras respostas aqui, além de https://stackoverflow.com/a/7579956/1484513 . Ele armazena as variáveis de instância privada (não estáticas) em uma matriz de classe privada (estática) e usa um ID de objeto para saber qual elemento dessa matriz contém os dados pertencentes a cada instância.
(->
i = 1
Object.defineProperty Object.prototype, "__id", { writable:true }
Object.defineProperty Object.prototype, "_id", { get: -> @__id ?= i++ }
)()
class MyClass
__ = []
_a = null
_b = null
c: null
_getA = -> a
getB: -> _b
getD: -> __[@._id].d
constructor: (a,b,@c,d) ->
_a = a
_b = b
__[@._id] = {d:d}
test1 = new MyClass 's', 't', 'u', 'v'
console.log 'test1', test1.getB(), test1.c, test1.getD()
test2 = new MyClass 'W', 'X', 'Y', 'Z'
console.log 'test2', test2.getB(), test2.c, test2.getD()
console.log 'test1', test1.getB(), test1.c, test1.getD()
console.log test1.a
console.log test1._a
class AnotherClass extends MyClass
test1 = new AnotherClass 's', 't', 'u', 'v'
console.log 'test1', test1.getB(), test1.c, test1.getD()
test2 = new AnotherClass 'W', 'X', 'Y', 'Z'
console.log 'test2', test2.getB(), test2.c, test2.getD()
console.log 'test1', test1.getB(), test1.c, test1.getD()
console.log test1.a
console.log test1._a
console.log test1.getA()