Thanks for looking at this post.
The content of the expression variable is the second line of the code, as below:
[["Detached", "!Detached!*!Ratio!", ""], ["Total", "!Total!*!Ratio!", ""]]
As you mentioned, the CalculateFields is expecting a Value table and here I tried to built a string. In fact, I tried to reuse the syntax provided when you export ModelBuilder to python... hence the [0] which I do not either understand its use.
As for error message, on runtime, Python simply ignore the CalculateFields!
As I said, using arcpy.management.CalculateField in a loop is an excellent workaround, using simple string variable (no need for Value table)