Делать require без присвоения в переменную можно и нужно, но только не внутри события connection, потому, что require исполняется синхронно, это блокирующая операция, т.е. на каждом подключении будет выполняться код, который будет приводит к чтению файла, а при этом не отдает управления в eventloop. Лучше поместите io на старте в глобальную переменную типа
global.api = {};
api.io = require('socket.io')(80);
api.events.connection = require('./lib/connection');
api.events.login = require('./lib/login');
...
api.io.on('connection', api.events.connection);
А в файле /lib/connection.js написать:
module.exports = function (socket) {
socket.on('login', api.events.login);
...
});