You could also consider implementing something with GeoJSON tiles. While not supported directly by Leaflet I think there are a few other options such as this one:
I think that draws the points on a canvas layer. I use another solution which I don't think is ideal for your situation but it might give you some other ideas to tackle the problem. This is to use the tileload event of my underlying data layer to load in geojson tiles (using TileStache). If a tile on my data/map layer is fetched, then so is the geojson tile. That way I don't need to worry about calculating bounds and checking which points have already loaded or not. Something like:
dataLayer.on('tileload', function(e) {
var tile=e.url.split("/");
var z=tile[tile.length-3];
var x=tile[tile.length-2];
var y=tile[tile.length-1].split(".")[0];
$.getJSON(geojsontile, function(data){
geojsonLayer.addData(data);
});
});
Only thing is when you change the zoom level it fetches all the geojson tiles again for the new layer (because it also fetches new map tiles, triggering the tileload again). For me this is not an issue as I have different features for each zoom level, I just remove all the geojson objects on a zoomstart event with geojsonLayer.clearLayers() and then let the new ones load in as the new underlying map tiles are loaded.
map.on('zoomstart',function(e) {
geojsonLayer.clearLayers();
});
Anyway this works really well for panning around, maybe less so for zooming out, but perhaps it can be a starting point for another idea.