I'd probably do something like this, which would be easy enough to turn into an underscore mixin:
var arr = [
['prop1', 'prop2', 'prop3', 'prop3'],
['val1', 'val2', 'val3', 'val4']
],
keys = arr[0],
vals = arr[1],
obj = {};
keys.forEach( function( name, index )
{
if ( !Object.prototype.hasOwnProperty.call(obj, name) )
{
obj[name] = vals[index];
}
else
{
if ( obj[name] instanceof Array )
{
obj[name].push( vals[index] );
}
else
{
var val = obj[name];
obj[name] = [val, vals[index]];
}
}
} );
Example in a fiddle. (turned into a mixin)