I'm assuming your list b will always have the same number of elements as there are lists in a and that you always want to replace (not insert) the second element.
This works:
for ax, bx in zip(a, b):
ax[1] = bx
First zip pairs up every element from a with the corresponding element from b, the for loop then gives you each pair one at a time as ax and bx. Since ax is a list, it's actually the list in a (not a copy) and with a[1] = bx you're just overwriting the second element in the list with bx.
Another way of doing it would be with a list comprehension:
new_a = [[ax[0], bx, *ax[2:]] for ax, bx in zip(a, b)]
This has the advantage of not modifying the original a, but gives you a new list with the replacements.
What happens here is that it still uses zip for the pairing, but instead of replacing ax[1], it makes a new list with the first element of ax, followed by bx and then followed by the rest of ax from the third element onwards. Notice the * in there - that 'explodes' the list into its separate elements, so they can be added to the new list.
You also asked about avoiding zip, although I think this is a worse solution:
for i in range(len(a)):
a[i][1] = b[i]
What this does is let i run from 0 to the length of a minus one, replacing the 2nd element of each element of a one at a time with the matching element from b, by using i to index both a and b.
[['04\01\1997','alphanum1','22','4.0'], ['07\01\1997','alphanum2','23','2.0']]? So, basically, you're looking to replace the 2nd element of the sublists of the first list with elements of the second list?