JavaScript (ES6), 87 7878 76 bytes
-9 bytes thanks to @RickHitchcock.
-2 bytes thanks to @Neil.
f=(s,i=10)=>s.trim()&&s+`
`+f(s.replace(/./g,c=>parseInt(c,36)-i>0>i?c:" "),i+1)
Takes input as a string and returns without anywith one trailing whitespacenewline.
Test Cases
f=(s,i=10)=>s.trim()&&s+`
`+f(s.replace(/./g,c=>parseInt(c,36)-i>0>i?c:" "),i+1)
;["hello", "Programming Puzzles & Code Golf!", "~|[abc<0>cba]|~", "abcdefg0123456789"]
.forEach(s=>console.log(f(s)));
.as-console-wrapper{max-height:100%!important}