It's possible, but you're going to have to "animate" with Python. There's no way to animate property values using the Dope Sheet or Graph Editor. Assuming you have the default cube and you've given it a custom string property called
MyString (through the interface... this would also work for custom properties defined with Python; it's just easier to see what's happening this way), you could write a handler that's triggered by the
frame_change_pre event. It would look like so:
ob = bpy.data.objects['Cube']
if scene.frame_current < 25:
ob['MyString'] = "First bit text"
elif 25 <= scene.frame_current < 46:
ob['MyString'] = "Next text part"
elif 46 <= scene.frame_current < 100:
ob['MyString'] = "Another bit of text"
ob['MyString'] = "Text after frame 99"
Now... if you want to be clever and still animate using the Dope Sheet, Graph Editor, or even the Timeline, you could probably extend this with some clever code that populates your string property with the string stored in a marker (e.g. find the closest marker less than the current frame and use the String stored there). If you only have one object in your scene that needs to be animated this way, it should work great.
A caveat... In my testing (r60747), you could only watch the custom property change values if you scrub through one frame at a time (Left Arrow and Right Arrow). Playing back animation with Alt+A works (you can check with a
print statement), but the value doesn't update in the interface. In fact, when I put my mouse cursor in the Properties Editor while playing back with Alt+A, it crashes Blender (bug report submitted).