..but if it can be scripted it can be animated, either via a driver or a frame_change event handler, or Sverchok / Animation Nodes and their Scripted Nodes.
import bpy
import random
for character in bpy.data.objects['Text'].data.body_format:
character.material_index = random.choice([0, 1])
''' more options per character '''
# character.use_bold
# character.use_italic
# character.use_small_caps
# character.use_underline
This loops through all characters in the body of the Font Object (even non-visible characters) and set their material_index to 0 or 1. Material_Indices and Material_Slots are explained here (Both Cycles and Blender Internal render use the same convention)
Yes this is not super convenient if you aren't comfortable with writing scripts, i'm guessing there aren't many requests for easy ways to do this.
As a Driver

import math
import random
import bpy
def driver_func(animation_state):
for i, character in enumerate(bpy.data.objects['Text'].data.body_format):
if i < animation_state:
character.material_index = 0
else:
character.material_index = 1
return 0
# add function to driver_namespace
bpy.app.driver_namespace['driver_func'] = driver_func
here's the blend, you drag the slider (purple) between 0 and 4 and it switches character materials.

(you will need to enable Auto Run Python Scripts... )
bpy.data.objects['Text'].data.materials.clear()and thenbpy.data.objects['Text'].data.materials.append(bpy.data.materials['Material'])for each. – Samoth Jun 01 '22 at 14:33