This is only partially correct. With unit vectors the vector of bound concepts will grow larger with more concepts. This can be prevented by introducing normalization, but this will make the binding with circular convolution a lossy operation. (As you note neurons saturate and thus will introduce some normalization-like behaviour.) This might make it necessary to use clean-up memories.
Another way to circumvent this problem is by using unitary vectors (note that all unitary vectors are unit vectors, but not all unit vectors are unitary vectors). A unitary vector preserves the length of the other vector in circular convolution. The terminology is derived form unitary transforms because the circular convolution with such a vector can be shown to be a unitary transform. I would recommend using unitary vectors where required, but only there. The number of unitary vectors is significantly smaller than the number of general semantic pointers that fit into a d-dimensional space. Where unitary vectors are required depends on how the representations are constructed, but usually only a few vectors need to be unitary.
nengo.spa.pointer.SemanticPointer class has a
make_unitary method to generate unitary pointers. It will normalize all the complex Fourier coefficients of that vector which preserves the phase shifts done by the circular convolution, but eliminates all scaling of the Fourier coefficients which will preserve the vector lengths.
Regarding the second question: There are other operations that could be used for binding (e.g. permutation) that we probably should look into more, but haven't yet. Another reasons to use circular convolution: It is fairly straight-forward to implement with the NEF/Nengo (once you figure out all the required transformation matrices). Also, we have some intuition what circular convolution is doing the vectors (it's somewhat like a rotation).