Проблема вот тут:
const remove = this.on(events
Метод on у Вас ничего не возвращает, соответственно в remove будет undefined, функции там взяться неоткуда.
Переменной events нет в скоупе данного метода, очевидно имелась в виду eventName
А вообще, вместо массива колбэков для события лучше использовать Set, так метод off будет работать за O(1), а не за O(n) как сейчас.
В методе once можно подписываться на событие через метод on, и отписываться через метод off при его наступлении (так например делает EventEmitter из node.js). Но стоит учесть момент, что off должен работать и для once событий, а у Вас будет записан колбэк созданный в once, а не тот, что передал пользователь. Вообще проще хранить 2 коллекции: для многоразовых для одноразовых событий, ну или параметризовать колбэки (тогда лучше хранить их в Map, где ключи - колбэки, а значения - их параметры).
Ну и еще обратите внимание, что у Вас в методах emit и once колбэк пользователя вызывается по разному:
callback.apply(this, args)
и
callback.call(null, args)