How to modify the value of a Function object?

To me, it seems like your solution (c1) before trying to use the conditional, is highly unstable (spurious behavior). So this is something you have to fix regardless of how you would like to bound your function.
The following alternative works for bounding the variables:

ff = File("c1.pvd")
for n in range(num_steps):
    print("Step:", str(n))

    # Compute solution for diffusion
    solve(a == L, c1, bc)
    ff << c1
    indices = np.argwhere(c1.vector()[:] > 3.75)
    c1.vector().vec().setValuesLocal(np.array(indices,dtype=np.int32), np.full(len(indices), 3.75))
    indices = np.argwhere(c1.vector()[:] < 0)
    c1.vector().vec().setValuesLocal(np.array(indices,dtype=np.int32), np.full(len(indices),0))
    c1.vector().apply("insert")

    solve(au == Lu, U, bcu)
    c0.assign(c1)
    #print results
    print("    min c:", c1.vector().get_local().min())
    print("    max c:", c1.vector().get_local().max())
    ff << c1

And as you can observe by inspecting c1.pvd, the output is highly spurious