What I came up with and worked for most cases was the Table[string, ptr maybe[X]] where
type maybe*[T] = object
case isDefined*: bool of true: data: sink T of false: discard
proc get*[T](m: maybe[T]): lent T {.inline.} = m.data
But the problem is that maybe.get() will move the data anyway.
