Samuel:
Não é bug. Quando foi dado o Free nesse objeto que gerou o erro, o endereço de memória para onde ele apontava já tinha sido liberado pelo Fields.Clear, executado anteriormente.
Pela pilha de chamadas é possível ver que a exceção foi disparada pelo método Free de um TField. Considerando a parte do código que você divulgou, foi no "Campo.Free", o que confere com o meu raciocínio.
Quando você chama TnxMemTable1.Close, por ser criada em memória, a tabela é destruída. Ao ser destruída, todos os TCollectionItens ligados à tabela também são destruídos, como é o caso dos Fields, items da coleção FieldDefs. Ocorre que você tem duas variáveis referenciando campos da tabela: "Campo" e "wcbTotal". Nesse caso, não importa onde você chame o método Free dessas campos, ocorrerá o erro de ponteiro. Se você der Free no Campo antes do Close da tabela, o Close da tabela vai gerar o erro de ponteiro, pois tentará liberar o Campo que já foi liberado. Se for ao contrário, como está no seu código, quando você der Free no Campo, ele já terá sido liberado pelo Close da tabela. Isso ocorre porque as variáveis está referenciando ponteiros para campos que integram a tabela, sendo que a tabela já se encarrega de destruir esses objetos, liberando a memória alocada para eles. Portanto bastaria você executar o método "Close" da tabela. Se quiser, pode atribuir "nil" às variáveis TField. Só não deve usar o método Free nas variáveis que aponta para os campos porque a tabela já terá feito isso no método Close.
Um abraço,
Jair