The bits in the register $d018 of the VIC encodes the adresses, where the memory areas which represents the text screen, the charset or the bitmap are located. See http://www.codebase64.org/doku.php?id=base:built_in_screen_modes for more information. Besides the locations, where the rom charsets are mirrored ($1000-$2000 and $9000-$a000) and the zeropage the charset may be placed anywhere in the memory. Use an font editor like the Faces editor, to create your own chars: http://noname.c64.org/csdb/release/?id=38933 (1×1 up to 4×2 charsets!)
By copying the rom charset to ram, the existing charset may be modified so that characters which are seldomly used can be replaced. For example the characters [,],π or £ could be used to implement country specific characters like öäüß in german or é è in french, for example.
More interesting anyways for demos or games is to make bigger letters than 8×8 points by using 2 or more characters for a symbol together. See Bigger letters
The charset memory may not only contain latin symbols. It can also hold parts of scenery for games. The characters then represent small parts of the background which is build up by these characters like a puzzle. This way the scenery can be easily scrolled like text. Block graphics
Realtime modification of the charset is used for paralax scrolling. A part of all the game scenery characters is then reserved for far distance backgrounds. While the whole screen is soft scrolling with a speed of one pixel per frame, the reserved chars are bit shifted in the opposite direction of the overall scrolling. This way they look like moving at another speed or not moving at all. Simple parallax shifting
The 16×16 character display can also be used for plotters. It can also be extended to 3 32×8 fields, with different charsets in each fields to cover the whole screen. This way very fast plot can be done.