You would be better off using [tabwrite~] for this. The whole thing could be simplified like this:
[osc~]
|
| [bang(
|/
[tabwrite~ dyn]
Clicking bang will fill up the table with the audio signal.
As for the block boundaries, all audio objects in Pd work on blocks (or vectors) of samples. They don't simply pass along one sample at a time. Instead they send blocks of 64 samples (by default). You can think of them like audio buffers at the DAC. So, each object gets a block of samples, processes them, and sends them to the next object to process. This is done for efficiency reasons.
Now, when most audio-rate objects receive a message, they wait until the end of the block for that message to take effect. Again, efficiency reasons. But sometimes you need more accurate timing. So that's where objects like [vline~] and [vsnapshot~] come in. They can take messages and still have sample-accurate timing with just a bit more of a hit on the computational load. So, specifically for those objects, [vsnapshot~] gives you the sample right when the bang was received, whereas [snapshot~] gives you the sample at the end of the block when the bang was received.
I'm guessing the reason why [metro] has a minimum of 1 ms is because [metro 0] would just cause a crash (it would be like [bang(-->[until]), so there has to be a limit. 1ms was probably chosen because [metro] really is meant to be more like a metronome clock (not an audio sampler), so that minimum probably seemed more than reasonable.