Another option is to model the concept of an animatable value with its own type:

vbnet Code:
  1. Public Interface IAnimatable(Of T)
  2.     Property AnimationValue As T
  3. End Interface

Which you can provide a concrete implementation for animating the width of a control - which can as part of its implementation deal with the issues of cross threading:
vbnet Code:
  1. Public Class ControlWidthAnimator
  2.     Implements IAnimatable(Of Integer)
  3.  
  4.     Private _control As Control
  5.     Private _width As Integer
  6.  
  7.     Public Sub New(control As Control)
  8.         _control = control
  9.         _width = _control.Width
  10.     End Sub
  11.  
  12.     Public Property AnimationValue As Integer Implements IAnimatable(Of Integer).AnimationValue
  13.         Get
  14.             Return _width
  15.         End Get
  16.         Set(value As Integer)
  17.             _width = value
  18.             SetWidth(_width)
  19.         End Set
  20.     End Property
  21.  
  22.     Private Sub SetWidth(newWidth As Integer)
  23.         If (_control.InvokeRequired) Then
  24.             _control.Invoke(New Action(Of Integer)(AddressOf SetWidth), newWidth)
  25.         Else
  26.             _control.Width = newWidth
  27.         End If
  28.     End Sub
  29. End Class

Allowing your Tweener code to deal with the abstract concept of an animatable value:
vbnet Code:
  1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
  2.     Dim t As New Threading.Thread(Sub() Tweener(New ControlWidthAnimator(Button1), 100, 400))
  3.     t.Start()
  4. End Sub
  5.  
  6. Public Sub Tweener(ByVal animatable As IAnimatable(Of Integer), ByVal Amount As Integer, ByVal tPeriod As Integer)
  7.     Dim stopat As Integer = Environment.TickCount + tPeriod
  8.     Dim tFrame = 40
  9.     Dim chunk As Integer = Amount / (tPeriod / tFrame)
  10.     While Environment.TickCount < stopat
  11.         animatable.AnimationValue += chunk
  12.         Application.DoEvents()
  13.         Threading.Thread.Sleep(tFrame)
  14.     End While
  15. End Sub

(I'd still deal with the animation with some kind of timer (be that a Windows.Forms.Timer on the UI thread or a System.Threading.Timer that returns on a worker thread) rather than sleeping in a worker thread, but now that's an orthogonal aspect of the code that can be altered independently of how the control itself gets altered.)