Is it possible to achieve this using jq or any other off-the-shelf tools?
It is. xidel can also do this very efficiently.
Let's assume 'input.json' :
{
  "item1": {
    "a": 1
  },
  "item2": {
    "b": 2
  },
  "item3": {
    "c": 3
  }
}
Inefficient Bash method:
for f in $(xidel -s input.json -e '$json()'); do
  xidel -s input.json -e '$json("'$f'")' > $f.json
done
For every object key another instance of xidel is called to parse the object. Especially when you have a very large JSON this is pretty slow.
Efficient file:write() method:
xidel -s input.json -e '
  $json() ! file:write(
    .||".json",
    $json(.),
    {"method":"json"}
  )
'
One xidel call creates 'item{1,2,3}.json'. Their content is a compact/minified object, like {"a": 1} for 'item1.json'.
xidel -s input.json -e '
  for $x in $json() return
  file:write(
    concat($x,".json"),
    $json($x),
    {
      "method":"json",
      "indent":true()
    }
  )
'
One xidel call creates 'item{1,2,3}.json'. Their content is a prettified object (because of {"indent":true()}), like...
{
  "a": 1
}
...for 'item1.json'. Different query (for-loop), same result.
This method is multitudes faster!