Почему вложенный цикл теряет доступ к открытому файлу со второй итерации основного цикла?
Потому что это вложенные циклы, а не параллельные.
Если тебе нужно удалить из А все элементы, которые есть в B, при этом, длины файлов недостаточно большие, чтобы занять всю твою оперативку, можно сделать так:with open('A.txt') as a, open('B.txt') as b, open('finish.txt', 'w') as finish:
    a_items = [l.strip() for l in a]
    b_set = {l.strip() for l in b}
    finish.write('\n'.join(item for item in a_items if item not in b_set))
Если в finish.txt не важно, не будет дубликатов из А или нет (или, например, A.txt содержит только уникальные значения) и порядок не важен тоже:with open('A.txt') as a, open('B.txt') as b, open('finish.txt', 'w') as finish:
    a_set = {l.strip() for l in a}
    b_set = {l.strip() for l in b}
    finish.write('\n'.join(a_set - b_set))
Используй b.seek(0) после каждого цикла по b. И не забудь закрыть файлы после работы с ними - хороший стиль. Либо используй with изначально.