As (almost) always, itertools.product
to the rescue:
>>> from itertools import product
>>> s = "10000101"
>>> all_poss = product(*(['1', '!'] if c == '1' else [c] for c in s))
>>> for x in all_poss:
... print(''.join(x))
...
10000101
1000010!
10000!01
10000!0!
!0000101
!000010!
!0000!01
!0000!0!
(Since we're working with one-character strings here we could even get away with
product(*('1!' if c == '1' else c for c in s))
if we wanted.)