It appears that all of the WhenCalled() calls must be made before any calls to the faked method/property. Changing to the following fixed the problem.
public void TestChangingBehavior() {
ClassUnderTest obj = new ClassUnderTest();
IValueSource source = Isolate.Fake.Instance<IValueSource>();
Isolate.WhenCalled(() => source.Value).WillReturn(1);
Isolate.WhenCalled(() => source.Value).WillReturn(2);
Assert.AreEqual(1, obj.ReturnValue(source));
Assert.AreEqual(2, obj.ReturnValue(source));
}
I think the previous code communicates intentions better, but this works.