Improving a little more on @kristian-barrett's and @vincent-audibert's answers
The recursive-object setting code was not handling setting arrays correctly, so I needed to check for objects, but ignore arrays, so that arrays will fallback to the 'leaf' case within createDDBUpdateExpression(...)
:
if (typeof filteredItem[key] === 'object' && !Array.isArray(filteredItem[key]))