Все правильно, this в вашем примере ссылается не на объект, а на module.exports. А что вы пытаетесь сделать?
UPD:
Не факт, что так нужно было, не понятна задача, что нужно было сделать? В зависимости от задачи можно заменить this.variable = "value" на замыкание:
// user.js
module.exports = function() {
var foo = 'bar';
var fn = function() {
// тут будет доступно значение foo = 'bar'
return foo;
}
return fn;
}
И account.js по аналогии
Потом можно вызывать:
var controllers = {};
controllers.user = require('./controllers/user')(); // обратите внимание на ()
controllers.account = require('./controllers/account')();
console.log(controllers.user()); // bar
console.log(controllers.account()); // baz
Таким образом, нет порождения новых объектов, но переменные сохраняются в замыканиях и оттуда возвращаются функциями.
Другой вариант, интереснее для вашего случая:
// user.js
module.exports = { foo: 'bar' };
И account.js по аналогии
Потом можно вызывать:
var controllers = {};
controllers.user = require('./controllers/user');
controllers.account = require('./controllers/account');
console.log(controllers.user.foo); // bar
console.log(controllers.account.foo); // baz
Но по вашему коду видно, что вы еще не определились что такое user и account - это функции или прототипы? Это контроллеры или модели? Советую не использовать слова контроллер и модель, пока не определитесь, что это такое.