When doing cel-shading you usually render a pass that stores the depth and normal values of each pixel into a texture. Thus you have your own z-buffer and access to the normals.
If either the difference of the normal or the z-value is over a certain threshold you add some black color to the pixel to make the edge look thicker.
If either the difference of the normal or the z-value is over a certain threshold you add some black color to the pixel to make the edge look thicker.