Here is a solution that draws on several of the other answers here plus https://stackoverflow.com/a/7579956/1484513.  It stores the private instance (non-static) variables in a private class (static) array and uses an object ID to know which element of that array contains the data belonging to each instance.
# Add IDs to classes.
(->
  i = 1
  Object.defineProperty Object.prototype, "__id", { writable:true }
  Object.defineProperty Object.prototype, "_id", { get: -> @__id ?= i++ }
)()
class MyClass
  # Private attribute storage.
  __ = []
  # Private class (static) variables.
  _a = null
  _b = null
  # Public instance attributes.
  c: null
  # Private functions.
  _getA = -> a
  # Public methods.
  getB: -> _b
  getD: -> __[@._id].d
  constructor: (a,b,@c,d) ->
    _a = a
    _b = b
    # Private instance attributes.
    __[@._id] = {d:d}
# Test
test1 = new MyClass 's', 't', 'u', 'v'
console.log 'test1', test1.getB(), test1.c, test1.getD()  # test1 t u v
test2 = new MyClass 'W', 'X', 'Y', 'Z'
console.log 'test2', test2.getB(), test2.c, test2.getD()  # test2 X Y Z
console.log 'test1', test1.getB(), test1.c, test1.getD()  # test1 X u v
console.log test1.a         # undefined
console.log test1._a        # undefined
# Test sub-classes.
class AnotherClass extends MyClass
test1 = new AnotherClass 's', 't', 'u', 'v'
console.log 'test1', test1.getB(), test1.c, test1.getD()  # test1 t u v
test2 = new AnotherClass 'W', 'X', 'Y', 'Z'
console.log 'test2', test2.getB(), test2.c, test2.getD()  # test2 X Y Z
console.log 'test1', test1.getB(), test1.c, test1.getD()  # test1 X u v
console.log test1.a         # undefined
console.log test1._a        # undefined
console.log test1.getA()    # fatal error