Indeed, the Linux MTD layer doesn't do any maintenance on the NAND/NOR memory.
For example, when a bitflip happens on your NAND, it's corrected by the ECC. The MTD layer is aware of that, but it doesn't DO anything about it. It just returns the error.
So you need another layer on top of MTD to take care of that.
One solution is to use UBI, which is designed to solve this kind of problems. Have a look at the UBI documentation on linux-mtd. If you want to stick with squashfs, it's possible to add another MTD abstraction on top of UBI (gluebi), then run squashfs on top of that. The result looks like that:
---------------------
| SquashFS |
---------------------
| MTD block |
---------------------
| MTD API (gluebi) |
---------------------
| UBI |
---------------------
| MTD driver |
---------------------
| Flash Chip |
---------------------
It makes a scary picture, but it works pretty well ;)
Have a look at this slides from free-electrons for more info (the picture comes from slide 47).
About the kernel, I'm not sure but I think U-Boot does support UBI. Never tried it though...