One option would be to use Q.all (Promise.all in ES6 promises and other libraries like Bluebird)
getOriginalString().then(function(orig){
return Q.all([orig,uppercase(x)]);
}).spread(function(orig,upper){
console.log(orig,upper);
});
You can of course still use a closure like the callback version (with nesting, or an outer scope).
Also, just to make sure, you don't need to promisify any function that doesn't make an I/O or otherwise asynchronous call.