Thinking that C++ is more efficient that Javascript is a common assumption, but as you found out it isn't necessarily true. The reason is that Javascript engines have become extremely efficient over the past years (check out the V8 engine from google), and most of them also implement JIT (Just-In-Time) compiling, meaning that after the initial load the javascript code will execute almost as fast as a machine compiled code like C. This is what QML's javascript engine uses, which explains your results.
If you're looking for bottlenecks, what we found out to be the number one bottleneck in most cases is the number property bindings, and excessive binding updates resulting in a "binding spaghetti effect".
QML makes it dangerously easy to create property bindings, especially when combined with state machines, and if you're not careful you can end up having one small property change triggering a re-evaluation of a huge amount of properties.
And those don't come for free, especially on embedded hardware, which can then significantly alter the performance in your application.
One of my colleagues is preparing a detailed article about that "binding spaghetti effect", we'll make sure to post it on this mailing list when it's published online. There's some pretty interesting findings in there.
That said, it is still good to try to avoid putting logic in javascript as much as possible, so as to keep a clear separation between QML for the UI part of your application and C++ for the logic part (unless you don't want any C++ at all in your app).