querySelectorAll root elements without using :scope

As an option, you could set a temporary unique attribute for your scope element, and then use querySelectorAll() for its parent with the attribute selector prepended to what you would place after the :scope selector:

// The `scope` variable stores a reference to the scope element.
var attrName = '_scope'  + Date.now();
scope.setAttribute(attrName, '');
var children = scope.parentNode.querySelector('[' + attrName + '] > DIV');

I’m not sure about how fast it is though.

Fwiw, specifically for getting child elements, there is the children DOM property:

var children = scope.children;

To get direct children of an element use a combination of parentNode.children or parentNode.childNodes, and Array.prototype.reduce like this:

var children = Array.prototype.reduce.call(el.children, function(acc, e) {
    if(e.tagName == "DIV")
        acc.push(e);
    return acc;
}, []);

Similar to @Ibrahims answer in selecting children but less complicated since it does not address prototype and reduce. Instead it uses Array.from, Array.filter and Element.matches. Element.matches makes it more versatile since it uses a normal selector string (as you would in querySelectorAll).

Array.from(rootElement.children)
  .filter(elm => elm.matches('div'))

const rootElement = document.getElementById('test-div')

Array.from(rootElement.children)
  .filter(elm=>elm.matches('div'))
  .forEach(elm=>elm.classList.add('matched'))
div {
  padding: 1rem;
  box-shadow: 0 0 0 1px gray inset;
}
.matched {
  box-shadow: 0 0 0 1px red inset;
}
<div id='test-div'>
    <div class='random-class-1'>
        <div class='useless-element-1'></div>
        <div class='useless-element-2'></div>
        <p>Just a paragraph, and useless</p>
    </div>
    <div class='random-class-2'>
        <div class='useless-element-3'></div>
        <div class='useless-element-4'></div>
        <div class='useless-element-5'></div>
    </div>
</div>