Alternate version, 29 bytes
33 DB XOR BX, BX ; running sum (BL) to 0
03 F1 ADD SI, CX ; start at end of string
4E DEC SI ; align for WORD
FD STD ; set LODSB direction to decrement
DIGIT_LOOP:
AD LODSW ; load next two digits into AH:AL, dec SI by 2
25 0F0F AND AX, 0F0FH ; convert ASCII chars to binary value
02 DC ADD BL, AH ; add ones digit of even index to sum
49 DEC CX ; decrement counter for WORD
74 0A JZ DONE ; if input is odd length, will be 0 at the end
D0 E0 SHL AL, 1 ; double the value
D4 0A AAM ; split digits (ex: 18 --> AH = 1, AL = 8)
02 DC ADD BL, AH ; add tens digit to sum
02 D8 ADD BL, AL ; add ones digit to sum
E2 ED LOOP DIGIT_LOOP
DONE:
93 XCHG AX, BX ; move sum to AL for mod 10 check
D4 0A AAM ; ZF = ( AL % 10 == 0 )
C3 RET ; return to caller
This version loads two digits at the same time, eliminating the flip/flop branch. The issue here is having to check for an odd number of digits on the input and discard the value in memory right before the beginning of the string once it reaches the last word. Obviously not shorter, but perhaps someone clever can golf it more!