Как следить за памятью самостоятельно?
в JS - никак. Вы можете разве что делать разные оптимизации поверх сборщика мусора - пул объектов, переиспользовать массивы, не создавать функции на каждый чих и так далее. Но большой вопрос - зачем это вам. 
Если у вас не реалтаймовое приложение с большим количеством данных - убедитесь что нет утечек памяти и успокойтесь :) 

Если просто душа просит другого - то вам нажен другой язык. И соответственно это будет не веб (разве что через WASI но это не точно)

Но, что если программист сам хочет принимать решения, и следить за памятью
Такого программиста надо отправить в хардкорную embedded разработку и он будет там счастлив, считая байты и подчищая регистры. А если будет оттуда выбираться и пытаться следить за памятью самостоятельно там где есть проверенные встроенные механизмы (GC, ARC и прочее) надо отбирать клавиатуру.
Над этим задумывались игроделы, потому, что GC периодически фризит процесс. И единственный способ этого избежать, не терять ссылки на объекты. Естественно все используемые объекты при этом должны переиспользоваться и нужно писать свой аллокатор, который повторно использует объекты не меняя имён и типов в них. И естественно, что стандартный контруктор не может быть использован для их повторной инициализации. С массивами чисел всё довольно просто, просто берём код malloc из emscripten и получаем начальный индекс в глобальном массиве и функциям передаём длину отрезка как в Си. С массивами объектов сложнее, ведь важно, чтобы оптимизатор, заранее знал тип объекта в массиве.
Как это называется? Мазохизм!