one possible reason (and I don't know if it's true in this case) would be that by doing this at the filesystem level they can be smarter than something at the block level could be.
some things could be implemented as a journal ('timestamp on this file changed from X at time T' is much shorter than duplicating the entire block)
the filesystem can also be smarter about the location of blocks when it's accessing a block device more directly. One problem with doing snapshots at the block level is that you very quickly end up with a lot of seeking. The filesystem can be smarter about this.
in practice it may or may not matter, but there are enough places where it could matter that it's worth exploring.