I can see two ways to do that. In pure Bash, iterating over the string character by character and adding each character to an array:
$ str='Hello World!'
# for (( i = 0; i < ${#str}; ++i )); do myarr+=("${str:i:1}"); done
$ declare -p myarr
declare -a myarr='([0]="H" [1]="e" [2]="l" [3]="l" [4]="o" [5]=" " [6]="W" [7]="o" [8]="r" [9]="l" [10]="d" [11]="!")'
The key element is the substring expansion, "${str:i:1}", which expands to the substring of str that starts at index i and has length 1. Notice that this is one of the few times where you don't have to prepend a variable with $ to get its contents, because the i is in an arithmetic context here.
Using an external tool, fold:
$ readarray -t arr <<< "$(fold -w 1 <<< "$str")"
$ declare -p arr
declare -a arr='([0]="H" [1]="e" [2]="l" [3]="l" [4]="o" [5]=" " [6]="W" [7]="o" [8]="r" [9]="l" [10]="d" [11]="!")'
fold -w 1 wraps the input string to one character per line, and the readarray command read its input into an array, line by line (-t removes the newline characters from each element).
Notice that readarray requires Bash 4.0 or newer.
awk -v FS="" ' {printf"{";for(i=1;i<=NF;i++) if(i!=NF)printf "\""$i"\",";print $i"}"}' inputfilethis has flaws so not putting it as answer.