Any way to avoid fcurves in scripting animations?
fcurves are how blender stores animation data. That is what it is for and you should just use it. If you are defining the animated values every frame then the interpolation will be of no concern. If your values only change on some frames then set the interpolation to be constant.

For creating the animation by script that would be

obj.location.x = 12.23
obj.keyframe_insert('location', index=0, frame=1)


If you really want to manually animate something without animation data, you should be able to use handlers to run a function every frame.

def myframe_change(scene):
    if scene.frame_current == 1:
        scene.objects['Cube'].location.x = 12.23

bpy.app.handlers.frame_change_pre.append(myframe_change)


If you are concerned about overhead, I think you will find running a python script every frame will add more overhead than using native animation data.