completing-read はインプットを文字列の始まりからマッチして補完してくれますが、
substring を受け取り、それをマッチして補完してくれる関数はありませんか?

例えば、インプットが "cde" で、マッチング対象のリストが
'("abc" "abcd" "abcdefg" "abcdefgh")
だった場合、"abcdefg" を返すといったイメージです。