An offset is a displacement you add to a position. If you are talking about the position in a list or an array, and the offset is from the beginning. Then yes, in that context, the offset is the index in refers to.
Instead, you could be talking about an offset from a given position on the array (from the end, for example). Then the offset would not match the index it refers to. You need to add the offset to the starting position from where you measure it (which is an index). When you count from the beginning, the index you add to the offset is 0.
You could also talk about offsets of position in memory. These offsets you add to a base address. For example, your array would have a base address. To that address you add an offset (multiplied by the size of an element) to find the position in memory of an index. For a counter example, you can also talk of the index of an element in a linked list. That element would be a node, which has a position in in memory. You do not find the positions other elements by adding the index to the position of the first element.
Staying with offsets of position in memory, we could be talking of a struct/record. Each member field of the struct/record has a position offset from the base address of it. You add that offset to find the position of the member field. Keep in mind that the size of each member field could be different.
And we could not be talking about a position in a list or array at all. If we are talking about positions on the screen, or in 3D virtual space, or whatever. In those situations, the positions are vectors. And so offsets are a vectors too. An offset would represent a translation transformation in whatever space you are working.
To summarize, indexes are discrete (integer), and count from the beginning. An offset is a position displacement. Offset can be discrete or "continuous" (floating point), and from any position you want.
It happens that an offset from the beginning of an array, corresponds to the same index of the array.