Why are many Chinese characters almost symmetrical but not exactly symmetrical?
This basically comes down to the vagaries of most CJK fonts being based on calligraphic scripts.

In Chinese calligraphy, characters are constructed out of individual strokes; these are written with a brush or pen in one continuous motion. 



The most common script type, regular script, was designed to be written with a brush. Certain techniques should be used when writing in this style, which gives it its distinctive, slightly-asymmetric look:


  …clearly emerging from the womb of early period semi-cursive script. If one were to write the tidily written variety of early period semi-cursive script in a more dignified fashion and were to use consistently the pause technique (dùn 頓, used to reinforce the beginning or ending of a stroke) when ending horizontal strokes, a practice which already appears in early period semi-cursive script, and further were to make use of right-falling strokes with thick feet, the result would be a style of calligraphy like that in the "Xuān shì biǎo".


This script was so influential that virtually all modern scripts and types are based on it. Even if there are types that are designed for computers like East Asian Gothic typeface, some asymmetric properties are preserved, like the "J hook" (钩) feature:



But if you look at earlier scripts, like seal script, you can find more symmetry, because the pictograms they were based on were based on symmetric things:



As an example, the character 西 could look like this in the earliest, oracle bone script: