You are right, TraMineR:::seqdef fills the positions of voids by shifting the subsequent elements to the left. To keep the positions of all the elements, you must assign a state (missing or any thing else) to each uninformed position. For instance, you can assign a state "L" to all left missing by passing argument left="L", and a state "G" to all gaps with gaps="G".

I illustrate with the example data ex1.

data(ex1)
s <- seqdef(ex1[1:6,1:12], left="L", gaps="G")
s

##    Sequence               
## s1 L-L-L-A-A-A-A-A-A-A-A-A
## s2 D-D-D-B-B-B-B-B-B-B    
## s3 L-D-D-D-D-D-D-D-D-D-D  
## s4 A-A-G-G-B-B-B-B-D-D    
## s5 A-G-A-A-A-A-G-A-A-A    
## s6 L-L-L-C-C-C-C-C-C-C

Doing so, plots will distinguish between left and gap missings. Likewise, indicators such as entropy or complexity index will treat elements L and G as additional elements of the alphabet. To compute edit distances, you can set specific indel and substitution costs for each of these two states.

The defaults are left=NA and gaps=NA, which assign "*" to left missings and gaps.