Referências realmente fracas, não, ainda não (mas os fabricantes de navegadores estão olhando para o assunto). Mas aqui está uma ideia de como simular referências fracas.
Você pode construir um cache através do qual você dirige seus objetos. Quando um objeto é armazenado, o cache mantém uma previsão de quanta memória o objeto ocupará. Para alguns itens, como armazenamento de imagens, isso é fácil de resolver. Para outros, isso seria mais difícil.
Quando você precisa de um objeto, solicita-o ao cache. Se o cache tiver o objeto, ele será retornado. Se não estiver lá, o item será gerado, armazenado e devolvido.
As referências fracas são simuladas pela remoção de itens de cache, quando a quantidade total de memória prevista atinge um determinado nível. Ele vai prever quais itens são menos usados com base na frequência com que são recuperados, ponderada por quanto tempo atrás foram retirados. Um custo de 'cálculo' também pode ser adicionado, se o código que cria o item for passado para o cache como um fechamento. Isso permitiria que o cache mantenha itens que são muito caros para construir ou gerar.
O algoritmo de exclusão é fundamental, porque se você errar, poderá acabar removendo os itens mais populares. Isso causaria um desempenho terrível.
Contanto que o cache seja o único objeto com referências permanentes aos objetos armazenados, o sistema acima deve funcionar muito bem como uma alternativa às verdadeiras referências fracas.