CSS animation via JavaScript
Your priority is to reduce dependency on expensive strings  :


Change all associative syntax, animation['x'] >>> dot notation, animation.x .
Change 'undefined' >>> undefined.
Avoid passing/returning strings to/from functions. They are passed by value (a function uses its own copy).
Pass back a number from calcPropValue() and do the toFixed() back in the caller statement.


Also :


The tween setting is the same for every call in the same turn of the for loop, therefore calculate it once and pass to calcPropValue().
Simplify testing of tween and display values.


Inside the for loop, assign :

display = (animation.display &amp;&amp; animation.display[1]) || null;
tween = (animation.tween &amp;&amp; animation.tween[1]) || null;


Don't forget to add tween to the var declaration.

Modify calcPropValue() as follows :

calcPropValue = function (value, tween) {
    return tweenEase(relativeScrollTop, value[0], (value[1] - value[0]), keyframesConverted[currentKeyframe].duration, tween);
}


Ternery's will become, eg : 

translateX = animation.translateX ? calcPropValue(animation.translateX, tween).toFixed(2) : '0.00';


Then consider sacrificing readability for performance by not assigning what the terneries return. Instead write them directly into the expressions where the resultant strings get used, eg :

'transform': 'translate3d(' + 
    (animation.translateX ? calcPropValue(animation.translateX, tween).toFixed(2) : '0.00') + 'px, ' + 
    (animation.translateY ? calcPropValue(animation.translateY, tween).toFixed(2) : '0.00') + 'px, 0.01px)' +
    (animation.scale ? ' scale(' + calcPropValue(animation.scale, tween).toFixed(2) + ')' : '') +
    (animation.rotate ? ' rotateX(' + calcPropValue(animation.rotate, tween).toFixed(1) + "deg)" : ''),


When you're done, pass the code through jslint or jshint to help spot any bloomers.